facebook twitter hatena line email

Unity/UniRx/AsObservable

提供: 初心者エンジニアの簡易メモ
2021年11月6日 (土) 09:54時点におけるAdmin (トーク | 投稿記録)による版 (非同期処理を記述する場合)

移動: 案内検索

メソッド説明

Subscribeは、イベント名を入れる AddToは、gameobjectが、使われなくなったら自動破棄してくれる。

ボタンサンプル

ボタンクリックで、カウントアップする

AsObservableサンプル

using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class SampleScene : MonoBehaviour
{
    void Start()
    {
        Button button = GameObject.Find("Button").GetComponent<Button>();
        Text text = GameObject.Find("Text").GetComponent<Text>();
        button.onClick.AsObservable()
            .Select(_ => 1)
            .Scan(0, (element, acc) => element + acc)
            .Subscribe (count => text.text = count.ToString())
            .AddTo(gameObject);
    }
}

OnClickAsObservableサンプル

public class SampleScene : MonoBehaviour
{
    void Start()
    {
        Button button = GameObject.Find("Button").GetComponent<Button>();
        Text text = GameObject.Find("Text").GetComponent<Text>();
        button.OnClickAsObservable()
            .Select(_ => 1)
            .Scan(0, (element, acc) => element + acc)
            .SubscribeToText(text)
            .AddTo(gameObject);
    }
}

DropDownサンプル

AsObservableを使う

using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class SampleScene : MonoBehaviour
{
    void Start()
    {
         Text text = GameObject.Find("Text").GetComponent<Text>();
         Dropdown dropdown = GameObject.Find("Dropdown").GetComponent<Dropdown>();
        dropdown.onValueChanged.AsObservable()
            .Subscribe(index =>
            {
                var value = dropdown.options[index].text;
                text.text = value;
            })
            .AddTo(gameObject);
    }
}

ObserveEveryValueChangedを使う

using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class SampleScene : MonoBehaviour
{
    void Start()
    {
         Text text = GameObject.Find("Text").GetComponent<Text>();
         Dropdown dropdown = GameObject.Find("Dropdown").GetComponent<Dropdown>();
         dropdown.ObserveEveryValueChanged(_ => _.value)
             .Subscribe(index => {
                var value = dropdown.options[index].text;
                text.text = value;
             })
            .AddTo(gameObject);
    }
}

OnValueChangedAsObservableを使う場合

using UnityEngine;
using UnityEngine.UI;
using UniRx;
public class SampleScene : MonoBehaviour
{
    void Start()
    {
         Text text = GameObject.Find("Text").GetComponent<Text>();
         Dropdown dropdown = GameObject.Find("Dropdown").GetComponent<Dropdown>();
        dropdown.OnValueChangedAsObservable()
            .Subscribe(index =>
            {
                var value = dropdown.options[index].text;
                text.text = value;
            })
            .AddTo(gameObject);
    }
}

Sliderを使う場合

Slider slider = GameObject.Find("Slider").GetComponent<Slider>();
slider.OnValueChangedAsObservable()
    .Subscribe(index =>
    {
        // float value = slider.value;
        float value = index;
        text.text = value.ToString();
    })
    .AddTo(gameObject);

入力欄

InputField inputField = GameObject.Find("InputField").GetComponent<InputField>();
IObservable<string> onEndEditAsObservable = inputField.OnEndEditAsObservable();
// 入力してフォーカスを外したら
onEndEditAsObservable.Subscribe(value =>
{
    Debug.Log("value=" + value);
    inputField.text = value;
});

有効無効切り替え

.Whereに、trueかfalseを入れる。

enabled = true;
button.OnClickAsObservable()
            .Where(_ => enabled)
            // .Where(_ => 1 == 1) // 有効
            // .Where(_ => 1 == 2) // 無効
            .Select(_ => 1)
            .Scan(0, (element, acc) => element + acc)
            .SubscribeToText(text)
            .AddTo(gameObject);

SelectやDistinctなどがある。以下参照。

Unity/UniRx/Subject [ショートカット]

非同期処理を記述する場合

UniTaskなどで、非同期処理を記述する場合の、asyncを書く位置

.Subscribe(async _ => Debug.Log("hoge"));

MonoBehaviaがない場合

</pre> CompositeDisposable disposable = new CompositeDisposable();

       userPresenter.OnEndEditNameObservable.Subscribe(value =>
       {
           Debug.Log("value=" + value);
       })
       .AddTo(disposable);

</pre>

参考

UniRxでボタンのクリック回数をテキストに表示する https://qiita.com/RyotaMurohoshi/items/01df35f1940e93fbb10d

【Unity】UniRxを使ってuGUIのイベントを監視する https://tm8r.hateblo.jp/entry/2016/05/13/203922