「Unity/UniRx/AsObservable」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→MonoBehaviaがない場合) |
(→DropDownサンプル) |
||
行60: | 行60: | ||
Text text = GameObject.Find("Text").GetComponent<Text>(); | Text text = GameObject.Find("Text").GetComponent<Text>(); | ||
Dropdown dropdown = GameObject.Find("Dropdown").GetComponent<Dropdown>(); | Dropdown dropdown = GameObject.Find("Dropdown").GetComponent<Dropdown>(); | ||
− | + | dropdown.onValueChanged.AsObservable() | |
.Subscribe(index => | .Subscribe(index => | ||
{ | { |
2021年11月19日 (金) 01:43時点における版
目次
メソッド説明
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); } }
- Selectは代入
- Scanは計算。詳しくはこちら、https://hikoleaf.hatenablog.jp/entry/2019/06/08/170736
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"));
MonoBehaviourがない場合
CompositeDisposableを使ってAddToする
CompositeDisposable disposable = new CompositeDisposable(); inputField.OnEndEditNameObservable.Subscribe(value => { Debug.Log("value=" + value); }) .AddTo(disposable);
参考
UniRxでボタンのクリック回数をテキストに表示する https://qiita.com/RyotaMurohoshi/items/01df35f1940e93fbb10d
【Unity】UniRxを使ってuGUIのイベントを監視する https://tm8r.hateblo.jp/entry/2016/05/13/203922