Unity でオブジェクトをドラッグして移動させる using UniRx
やりたいこと:タイトルのまま
最近話題のUniRxを使ってみました.
using UniRx; using UniRX.Triggers; using UnityEngine; public class DraggedObject : MonoBehaviour { void Start() { this.OnMouseDragAsObservable() .TakeUntilDestroy(this) // このオブジェクトが破壊されるまで .Select(_ => Input.mousePosition) .Select(pos => { pos.z = this.transform.position.z; return Camera.main.ScreenToWorldPoint(pos); }) .Select(pos => new Vector3(pos.x, pos.y, this.transform.position.z)) .Subscribe(pos => this.transform.position = pos); } }
これだけで,左クリックからのドラッグが書ける! すごい! ただ,OnMouseDragAsObservable は,右クリックからのドラッグには反応しませんでした.
というわけで,右クリック判定のメモ(右クリックのみ)
this.UpdateAsObservable() .Where(_ => Input.GetMouseButtonDown(1)) // 右クリックの時 .Select(_ => Camera.main.ScreenPointToRay(Input.mousePosition)) .Select(x => { RaycastHit rh; var hit = Physics.Raycast(x, out rh); // オブジェクトへの当たり判定 return Tuple.Create(hit, rh); }) .Where(x => x.Item1 && x.Item2.collider.gameObject == this.gameObject) // 当たったか,また,あたった対象がこのオブジェクトか .Subscribe(_ => Debug.Log("Right!!"));