Unity/UniRx/AsObservable
ナビゲーションに移動
検索に移動
メソッド説明
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(x => x.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);
Toggleを使う場合
Observable<bool> toggleOnValueChangedAsObservable;
toggleOnValueChangedAsObservable = toggle.OnValueChangedAsObservable();
toggleOnValueChangedAsObservable
.Subscribe(value =>
{
// 処理
}).AddTo(disposable);
入力欄
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();
disposableを、null判定する場合はこちら
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
2つのObservableを1つに
Observable.Mergeを使う。
[SerializeField] Button button;
[SerializeField] Button button2;
buttonOnClickAsObservable =
Observable.Merge(
button.OnClickAsObservable(),
button2.OnClickAsObservable()
);
参考
UniRxでボタンのクリック回数をテキストに表示する https://qiita.com/RyotaMurohoshi/items/01df35f1940e93fbb10d
【Unity】UniRxを使ってuGUIのイベントを監視する https://tm8r.hateblo.jp/entry/2016/05/13/203922