UniRx使えたら楽しそうだなぁってことで、勉強はじめて行きます。
勉強の方針は、
作りながら覚える!
で、作るものは
「Unityの教科書」のサンプルプロジェクト
1年前、僕はその本を買って必死に読んでました。
そして、1年経った今、そのサンプルプロジェクトをUniRxベースで作り直してやろうってワケです。
なんで、Unityの教科書を選んだかって言うと、
1、物(imageとか)を作る必要がない(用意されている)ので、プログラミングに集中できる。
2、シンプルなゲームを作っている
3、作成企画を考える必要がない
ですね、
やっぱモデリングとかイラストとか描くのに時間かけたくないし、最初は簡単なゲームがいい。
今回の目的は「UniRxの勉強」だからこれに集中するのです。
では第1回目始めていこう。
下調べ
UniRx??なんか凄いやつ?
という認識で始めては流石にまずいので色々調べた。
調べたけど、 よくわからなかった。
けど、 よくわからなくてもいいかなって思ってる。
だって、ちょっと知ってるだけで、聴き慣れない言葉に怯えることもなくなるし、作っていく途中での疑問の解決速度も上がるから。
<読んだ記事>
実践
今回はUnityの教科書chapter2のスクリプト関係。Debug.Log()を使ってUniRxに触れてみることにする。
簡単そうなクリック系の物を作ってみる。
UniRxのインストール
UniRxはアセットストアかGitHubから入手するらしい。
アセットストアからダウンロードしてインポート。
スクリプト書いてみる
空のオブジェクト作って、「Test.cs」をアタッチ
スクリプトは
うん、クリックしたらログでた。
仕組みは
UpdateAsObservable()
ー 毎フレームイベントがくる
.Where(_ => Input.GetMouseButtonDown(0))
ー 来たイベントのうち、左クリック(Down)の物だけ通過させる
.Subscribe(_ => Debug.Log("input"));
ー ログ!!
あと、実行中に気がついたのだけど、ー 毎フレームイベントがくる
.Where(_ => Input.GetMouseButtonDown(0))
ー 来たイベントのうち、左クリック(Down)の物だけ通過させる
.Subscribe(_ => Debug.Log("input"));
ー ログ!!
ってなってる。
「Observable Update Trigger (Script)」
なんだ、これは?
1つのストリームか?
それとも
UniRxのインスタンスオブジェクトか?
調べるためにスクリプトに加筆
結果
スクリプトの数さっきと一緒だから、UniRxのインスタンスっぽいね。
これを生成しておくことで、色々裏で最適化してくれているのだろう。きっと。
色々実験
スクリプトはこんな感じになりました。using UnityEngine; using UniRx; using UniRx.Triggers; using System; public class Test :MonoBehaviour { void Start() { this.UpdateAsObservable() .Where(_ => Input.GetMouseButtonDown(0)) .Subscribe(_ => Debug.Log("Left!")); this.UpdateAsObservable() .Where(_ => Input.GetMouseButtonDown(1)) .Subscribe(_ => Debug.Log("Right!")); Observable.EveryUpdate() .Where(_ => Input.GetKeyDown(KeyCode.Space)) .Subscribe(_ => Debug.Log("Space!-NO AddTo")); Observable.EveryUpdate() .Where(_ => Input.GetKeyDown(KeyCode.Space)) .Subscribe(_ => Debug.Log("Space!-AddTo")) .AddTo(this.gameObject); Observable.Timer(TimeSpan.FromSeconds(5)) .Subscribe(_ => Destroy(this.gameObject)); } }
わかったこと
作られるやつは、色々ある
自動で消えず、GameObjectに結びついてない(AddTo()しなかった)やつはDontDestroyOnLoadのとことに作られる。
こいつを残しっぱなしにして溜めすぎるとメモリリーク起こすのかな?
ちゃんとGameObjectに結びついてるのは、UniRxの実体もちゃんと消える
感想
今回はメソッドチェーンで書いたストリームでUpdate()を消し去ってみた。
入力監視をStart()で、まとめて定義しておけるのは見やすいし、便利だと思う。
今回はobservarとかSubjectを意識しない物を書いた。
これが正しいUniRxの使い方なのかはわからないけど、少しUniRxについてわかった気がする。
次回は Unityの教科書chapter3 のルーレットをUniRxで作っていこうと思う。
-今回のUnityプロジェクト-
0 件のコメント:
コメントを投稿