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 をドラッグで移動したい場合は,下記の記事をご参照下さい.