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!!"));