「Unity/UniRx/AsObservable」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→Observableを分割) |
|||
(同じ利用者による、間の41版が非表示) | |||
行1: | 行1: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
==メソッド説明== | ==メソッド説明== | ||
− | + | Subscribeは、イベント名を入れる | |
+ | AddToは、gameobjectが、使われなくなったら自動破棄してくれる。 | ||
==ボタンサンプル== | ==ボタンサンプル== | ||
ボタンクリックで、カウントアップする | ボタンクリックで、カウントアップする | ||
− | AsObservableサンプル | + | ===AsObservableサンプル=== |
<pre> | <pre> | ||
using UnityEngine; | using UnityEngine; | ||
行25: | 行21: | ||
.Select(_ => 1) | .Select(_ => 1) | ||
.Scan(0, (element, acc) => element + acc) | .Scan(0, (element, acc) => element + acc) | ||
− | .Subscribe (count => text.text = count.ToString ()) | + | .Subscribe (count => text.text = count.ToString()) |
.AddTo(gameObject); | .AddTo(gameObject); | ||
} | } | ||
行31: | 行27: | ||
</pre> | </pre> | ||
− | OnClickAsObservableサンプル | + | ===OnClickAsObservableサンプル=== |
<pre> | <pre> | ||
public class SampleScene : MonoBehaviour | public class SampleScene : MonoBehaviour | ||
行47: | 行43: | ||
} | } | ||
</pre> | </pre> | ||
+ | *Selectは代入 | ||
+ | *Scanは計算。詳しくはこちら、https://hikoleaf.hatenablog.jp/entry/2019/06/08/170736 | ||
+ | |||
+ | ====3回ボタンを押すと処理される==== | ||
+ | <pre> | ||
+ | public class SampleScene : MonoBehaviour | ||
+ | { | ||
+ | void Start() | ||
+ | { | ||
+ | Button button = GameObject.Find("Button").GetComponent<Button>(); | ||
+ | Text text = GameObject.Find("Text").GetComponent<Text>(); | ||
+ | button.OnClickAsObservable() | ||
+ | .Buffer(3) | ||
+ | .Subscribe(_ => text.text = "test3") | ||
+ | .AddTo(gameObject); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | 他に条件についてはこちらを参考:https://light11.hatenadiary.com/entry/2018/11/17/150424 | ||
==DropDownサンプル== | ==DropDownサンプル== | ||
+ | |||
+ | AsObservableを使う | ||
+ | <pre> | ||
+ | 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); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ObserveEveryValueChangedを使う | ||
<pre> | <pre> | ||
using UnityEngine; | using UnityEngine; | ||
行63: | 行102: | ||
var value = dropdown.options[index].text; | var value = dropdown.options[index].text; | ||
text.text = value; | text.text = value; | ||
− | }); | + | }) |
+ | .AddTo(gameObject); | ||
} | } | ||
} | } | ||
</pre> | </pre> | ||
+ | |||
+ | OnValueChangedAsObservableを使う場合 | ||
+ | <pre> | ||
+ | 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); | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ==Sliderを使う場合== | ||
+ | <pre> | ||
+ | Slider slider = GameObject.Find("Slider").GetComponent<Slider>(); | ||
+ | IObservable<float> sliderOnValueChangedAsObservable = slider.OnValueChangedAsObservable(); | ||
+ | sliderOnValueChangedAsObservable | ||
+ | .Subscribe(index => | ||
+ | { | ||
+ | // float value = slider.value; | ||
+ | float value = index; | ||
+ | text.text = value.ToString(); | ||
+ | }) | ||
+ | .AddTo(gameObject); | ||
+ | </pre> | ||
+ | |||
+ | ==入力欄== | ||
+ | <pre> | ||
+ | InputField inputField = GameObject.Find("InputField").GetComponent<InputField>(); | ||
+ | IObservable<string> onEndEditAsObservable = inputField.OnEndEditAsObservable(); | ||
+ | // 入力してフォーカスを外したら | ||
+ | onEndEditAsObservable.Subscribe(value => | ||
+ | { | ||
+ | Debug.Log("value=" + value); | ||
+ | inputField.text = value; | ||
+ | }); | ||
+ | // 入力中 | ||
+ | IObservable<string> onValueChangedObservable = inputField.OnValueChangedAsObservable(); | ||
+ | onValueChangedObservable.Subscribe(value => | ||
+ | { | ||
+ | Debug.Log("value=" + value); | ||
+ | }); | ||
+ | </pre> | ||
+ | |||
+ | ==有効無効切り替え== | ||
+ | .Whereに、trueかfalseを入れる。 | ||
+ | <pre> | ||
+ | enabled = true; | ||
+ | button.OnClickAsObservable() | ||
+ | .Where(_ => enabled) | ||
+ | // .Where(_ => 1 == 1) // 有効 | ||
+ | // .Where(_ => 1 == 2) // 無効 | ||
+ | .Select(_ => 1) | ||
+ | .Scan(0, (element, acc) => element + acc) | ||
+ | .SubscribeToText(text) | ||
+ | .AddTo(gameObject); | ||
+ | </pre> | ||
+ | |||
+ | ==他== | ||
+ | SelectやDistinctなどがある。以下参照。 | ||
+ | |||
+ | [[Unity/UniRx/Subject]] [ショートカット] | ||
+ | |||
+ | ==非同期処理を記述する場合== | ||
+ | UniTaskなどで、非同期処理を記述する場合の、asyncを書く位置 | ||
+ | .Subscribe(async _ => Debug.Log("hoge")); | ||
+ | |||
+ | ==MonoBehaviourがない場合== | ||
+ | CompositeDisposableを使ってAddToする | ||
+ | <pre> | ||
+ | CompositeDisposable disposable = new CompositeDisposable(); | ||
+ | inputField.OnEndEditNameObservable.Subscribe(value => | ||
+ | { | ||
+ | Debug.Log("value=" + value); | ||
+ | }) | ||
+ | .AddTo(disposable); | ||
+ | </pre> | ||
+ | 削除は | ||
+ | disposable.Dispose(); | ||
+ | |||
+ | ==Observableを一度変数に== | ||
+ | <pre> | ||
+ | using System; | ||
+ | using UniRx; | ||
+ | IObservable<Unit> clickObservable = button.OnClickAsObservable(); | ||
+ | clickObservable | ||
+ | .Subscribe (_ => { | ||
+ | text.text = count.ToString(); | ||
+ | }) | ||
+ | .AddTo(gameObject); | ||
+ | </pre> | ||
+ | |||
+ | ==Rectのサイズ変更時== | ||
+ | <pre> | ||
+ | var trigger = commentText.transform.parent.GetComponent<ObservableRectTransformTrigger>(); | ||
+ | trigger.OnRectTransformDimensionsChangeAsObservable() | ||
+ | .Subscribe(_ => { | ||
+ | // コメントオブジェクトの半分 | ||
+ | Debug.Log(commentText.transform.parent.GetComponent<RectTransform>().sizeDelta.x / 2f); | ||
+ | } | ||
+ | ).AddTo(gameObject); | ||
+ | </pre> | ||
+ | 参考:https://kan-kikuchi.hatenablog.com/entry/UniRx_OnRectTransformDimensionsChangeAsObservable | ||
+ | |||
==参考== | ==参考== | ||
+ | UniRxでボタンのクリック回数をテキストに表示する | ||
https://qiita.com/RyotaMurohoshi/items/01df35f1940e93fbb10d | https://qiita.com/RyotaMurohoshi/items/01df35f1940e93fbb10d | ||
+ | |||
+ | 【Unity】UniRxを使ってuGUIのイベントを監視する | ||
+ | https://tm8r.hateblo.jp/entry/2016/05/13/203922 |
2023年2月13日 (月) 14:24時点における版
目次
メソッド説明
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
3回ボタンを押すと処理される
public class SampleScene : MonoBehaviour { void Start() { Button button = GameObject.Find("Button").GetComponent<Button>(); Text text = GameObject.Find("Text").GetComponent<Text>(); button.OnClickAsObservable() .Buffer(3) .Subscribe(_ => text.text = "test3") .AddTo(gameObject); } }
他に条件についてはこちらを参考:https://light11.hatenadiary.com/entry/2018/11/17/150424
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>(); IObservable<float> sliderOnValueChangedAsObservable = slider.OnValueChangedAsObservable(); sliderOnValueChangedAsObservable .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; }); // 入力中 IObservable<string> onValueChangedObservable = inputField.OnValueChangedAsObservable(); onValueChangedObservable.Subscribe(value => { Debug.Log("value=" + 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);
削除は
disposable.Dispose();
Observableを一度変数に
using System; using UniRx; IObservable<Unit> clickObservable = button.OnClickAsObservable(); clickObservable .Subscribe (_ => { text.text = count.ToString(); }) .AddTo(gameObject);
Rectのサイズ変更時
var trigger = commentText.transform.parent.GetComponent<ObservableRectTransformTrigger>(); trigger.OnRectTransformDimensionsChangeAsObservable() .Subscribe(_ => { // コメントオブジェクトの半分 Debug.Log(commentText.transform.parent.GetComponent<RectTransform>().sizeDelta.x / 2f); } ).AddTo(gameObject);
参考:https://kan-kikuchi.hatenablog.com/entry/UniRx_OnRectTransformDimensionsChangeAsObservable
参考
UniRxでボタンのクリック回数をテキストに表示する https://qiita.com/RyotaMurohoshi/items/01df35f1940e93fbb10d
【Unity】UniRxを使ってuGUIのイベントを監視する https://tm8r.hateblo.jp/entry/2016/05/13/203922