@Baiteen
ReactiveExtensionsがUnityでも使えるってのを今更知ったので、今更ながら使ってみた。
環境
・Unity 4.5.1f3・UniRx 4.3 (AssetStoreから”UniRx”で検索してインポートしました)
やりたいこと
ReactiveExtensionsを使ってダブルクリックイベントを検知する。やったこと
(UniRxはインポート済み)まずは、ダブルクリックするためのCubeを追加(Cubeじゃなくてもいい)
それからC#Scriptを作成してコードを以下のように変更(今回はTestScriptにしました)
そしてTestScriptをCubeにドラッグ&ドロップしたら出来上がり
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UniRx; public class TestScript : ObservableMonoBehaviour { ///クリック間隔 public class ClickInterval { public TimeSpan Interval { get; set; } public Vector3 Location { get; set; } } ///ダブルクリックイベント引数 public class DoubleClickEventArgs : EventArgs { ///クリック間隔リスト public IListClickIntervals { get; private set; } public DoubleClickEventArgs(IList clickIntervals){ this.ClickIntervals = clickIntervals; } } /// ダブルクリックイベントハンドラ public event EventHandlerDoubleClickEventHander; /// ダブルクリックイベントを発生させます private void OnDoubleClick (IListclickIntervals) { if (this.DoubleClickEventHander != null) { this.DoubleClickEventHander(this, new DoubleClickEventArgs(clickIntervals)); } } /// RXのサンプルがAwakeだったので、ここに書きました。 public override void Awake () { //参考サイト:http://neue.cc/2010/07/28_269.html //今回の場合、この変数は必要ない var mouseDoubleClickObservable = //マウスダウンされると値が発行される OnMouseDownAsObservable() //発行された値と前回の時間との差分を包んだオブジェクトを返す .TimeInterval() //マウスダウンされた位置もほしいので、自作のクラスにして後続に渡す .Select(i => new ClickInterval(){ Interval = i.Interval, Location = Input.mousePosition }) //ダブルクリックなので2回マウスダウンされるまで貯めこむ //トリプルクリックを検知したければここを3にすればいけるんじゃないかな .Buffer(2) //”1回目のマウスダウン”の”前回の時間との差分”が1秒以上であること //これをしないと3クリックで2回ダブルクリックイベントが発生してしまう(1,2と2,3) .Where(l => l.First().Interval.TotalSeconds > 1) //”1回目のマウスダウン”以外のマウスダウンの”前回の時間との差分”が全て1秒未満であること //せっかちの人は0.5とかにしてあげればいいかな .Where(l => l.Skip(1).All(i=>i.Interval.TotalSeconds < 1)) //発行される値の監視を開始。値が発行されたらダブルクリックイベントを発行させる .Subscribe(l => this.OnDoubleClick(l)); this.DoubleClickEventHander += (sender, e) => Debug.Log("double click"); // If you use ObservableMonoBehaviour, must call base method ← サンプルにこう書いてますので、そのまま。 base.Awake (); } }
実行してCubeをダブルクリックするとログが吐かれることを確認できる。はず。
こんな感じ。
って、あれ?うに部屋から埋め込みタグをコピー出来なくてサンプル貼れない。。。
まぁいいや。
UniRxの記事が少なすぎて焦った。