uGui と UniRx を組み合わせて,ドラッグできるパネルや長押し(押してる間特定の動作をする)ボタンを作成

Unity の uGui と UniRx を組み合わせてドラッグや長押しを実装してみたので,メモしておきます.
ここで言う長押しボタンは,数秒押したら反応するボタンではなく,押している間,特定の動作をするボタンのことです.
なんていえばいいのか分からないので,便宜上,長押しボタンといいます.

uGui パネルのドラッグ

下記のスクリプトを,uGui のパネルにアタッチしてやると,そのパネルをドラッグで移動させることができます.

using System;
using UniRx;
using UniRx.Triggers;
using UnityEngine;
using UnityEngine.UI;

public class DragPanel : MonoBehavior
{
    Void Start()
    {
        var et = this.gameObject.AddComponent<ObservableEventTrigger>();

        this.UpdateAsObservable()
            .SkipUntil(et.OnPointerDownAsObservable())  // ポインタが下がるまでスキップ
            .TakeUntil(et.OnPointerUpAsObservable())    // ポインタが上がると終了
            .Repeat()   // 繰り返す
            .Select( _=> Input.mousePosition )
            .Subscribe( pos =>
            {
                var rect = this.gameObject.GetComponent<RectTransform>();
                rt.anchoredPosition = new Vector2(pos.x, pos.y);
            })
            .AddTo(this);
    }
}

このスクリプトは,アタッチされたパネル上でマウスポインタを押している間,そのマウスポインタの位置をパネルの位置に置き換えています.

uGui 長押しボタン

また,このスクリプトをButton にアタッチして,Subscribe の中身を書き換えてやれば,ボタンを押している間,特定の動作を行うボタンになります.

ちなみに,uGuiではないGameObject をドラッグで移動したい場合は,下記の記事をご参照下さい.

rinor.hatenablog.com