2年くらい前から勉強するする詐欺していたUniRXですが、
業務の空き時間がヤバいことになっているので、その合間に触ってみた話。
〇参考スライド
https://www.slideshare.net/torisoup/unity-unirx
とりあえず、1~95まで眺めて、78~95までは、色々と実験しながら触ってみた。
〇使えるようにするまで
とりあえず、UnityEditorを立ち上げて、
メニューのwindow ⇒ AssetStoreを押す。
そこの検索窓に「UniRX」って検索して、全部インストールすればおk。
〇実験した内容と解釈
とりあえず、上記スライドを見て95ページくらいまでなら思考停止でも進められるのでやってみて欲しい。
筆者なりの解釈は、以下の実験コードのコメントに記載してみた。
using System; // TimeSpan使うのに必要 using System.Collections; using System.Collections.Generic; using UniRx; // UniRX使う為 using UniRx.Triggers; // this.UpdateAsObservable()とか使う為 using UnityEngine; using UnityEngine.UI; public class UniRXTest : MonoBehaviour { [SerializeField] private Button TestButton; [SerializeField] private Text TestText; int count = 0; bool stateCheck = false; // Use this for initialization void Start () { // ↓ダブルクリック(最後にクリックが押されてから200ミリ待って、実行。なので、厳密にはダブル以上クリック var stream = this.UpdateAsObservable() // 毎フレームストリームを発行(というイメージ) .Where(_ => Input.GetMouseButtonDown(0)); // ボタンを押された時だけ、というフィルタ // ↑の、まとまり var otherStream = stream.Throttle(TimeSpan.FromMilliseconds(200f));// ストリームが到達してから、200ミリ経過したら。つまり、ストリームが届くとリセットされる。 // ↑つまり、ボタンを押された時にここまで来るので、ボタンを押されてから200ミリ経過したら、というまとまり stream.Buffer(otherStream) // Buffer = 条件が揃うまで待つ、とすると覚えやすいかも .Where(x => x.Count >= 2) // 押された回数が2回以上、というフィルター .Subscribe(_ => { // 処理発行 Debug.Log("TEST"); Debug.Log(_.Count); }); // ↑ここまで // つまり、毎フレームストリームは流れているのだが // ボタンが押された時から時間を数え始め // 200ミリ経過された時点で // 押された回数が2回なら発火 // ↓状態変更検知(状態が変わったら、次のストリームに流すサンプル的な) this.UpdateAsObservable() .Select(_ => stateCheck) // 流す情報を、bool型の変更している。Selectは、そういう変更を行う指令 .DistinctUntilChanged() // これが、前の状態と比べて変化していたら、だと思われる。 .Where(_ => _ == true) // trueの時というフィルタ .Subscribe(_ => { // 発火 Debug.Log(_); }); // ↑ここまで } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) { stateCheck = !stateCheck; } } }
〇感想
沢山条件が指定できるモジュールみたいなイメージが沸いた。
今のところは、やれることが全然把握できていないので、無理して使うという感じにはならないが、
煩わしい処理を書いているなと感じた時に、UniRXにしてみたらどうなるのだろう、という思考にしてみようと思った。
もしかしたら、道が開けやすいかもしれない。