UniRxのシンプルなサンプル その5(Buttonが押されたら動くGameObjet)

More than 3 years have passed since last update.

UniRxのシンプルなサンプルの取扱説明書

前(SkipとSkipWhile)

次(購読の停止)


ButtonのonClickに関連付ける

今まではEveryUpdateが手軽で簡単に内容を見ることができたのでそちらを使っていたのですが、

第一回で強力なイベントとか言ってしまったのでイベントっぽいことについてやっていきます。

EveryUpdateはUniRxの登録先のほんの一箇所というだけです。本来いろんな登録先があるのでそれはドキュメントとか見ればわかります。(ぶんなげ)


前準備

今回は今までのただのSpriteのGameObject以外にButtonを作っています。

ClickButtonは最初の一回だけGameObjectが右に移動するボタン

TwoClickButtonは青いGameObjectが右に動くけど最初の1回だけ反応しないボタン

を目指します。

スクリーンショット 2015-05-03 16.48.06.png


最初の一回だけGameObjectが右に移動するボタン

Button.onClick.AsObservable()でクリックされた時に値をプッシュしてくれる登録先を取得することができます。なのでここにMove(1f,0)を登録して右に動くようにします。

最初の一回だけ押されたらオブジェクトが動くボタンはeventでやると既にクリックされたかどうかのフラグを持たなければいけません。

でも、UniRxならFirstで表現ができます。

というわけでコードは次のようになります。


ClickButton

using UnityEngine;

using System.Collections;
using UnityEngine.UI;
using UniRx;

public class ClickButton : Base {

public Button Button;
// Use this for initialization
void Start () {
gameObject.transform.position = new Vector2(0, 1f);
//クリックされた最初の一回だけ値をプッシュ
Button.onClick.AsObservable().First()
.Subscribe(l => Move(1f, 0));
}
}


このようにeventでは地味にめんどくさい最初の一回だけとか言うのもUniRxではよゆーです。

あ、Buttonはインスペクターから登録しておいてくださいね。


最初の1回だけ反応しないボタン

逆にSkipを使えばこちらも問題なし


TwoClickButton

using UnityEngine;

using System.Collections;
using UnityEngine.UI;
using UniRx;

public class TwoClickButton : Base
{

public Button Button;
// Use this for initialization
void Start()
{
gameObject.transform.position = new Vector2(0, 1.5f);

//1回目はスキップする
Button.onClick.AsObservable().Skip(1)
.Subscribe(u => Move(1f, 0));
}
}



実行結果

スクリーンショット 2015-05-03 17.03.58.png

というわけでそれぞれのボタンが出来ました。

ところでですね、ここで実行中に青のスプライトを消してボタンを押すとどうなるでしょう?

スクリーンショット 2015-05-03 17.06.17.png

MissingReferenceException: The object of type 'TwoClickButton' has been destroyed but you are still trying to access it.

Your script should either check if it is null or you should not destroy the object.

とか出ます。

要するに登録したイベントを実行したらGameObjectが死んでるからエラーなんですね。

勝手に登録解除してくれないんです!

きっと情報メールとかもこんなんでデーモン帰ってきそうだなーとか思います。

と、このへんの話を次でします。


閑話休題

全く関係ない話なんですけど公開メンバについて

Unityの標準の命名規則がlowerCamel

C#の命名規則がPascal

なんですよね

僕はC#erなので(いろいろ考えた結果)Pascal採用してるんですけどどっちが多いんでしょう?

ちなみにprivateはlowerCamelです。