facebook twitter hatena line email

「Unity/UniRx/AsObservable」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(参考)
(Sliderを使う場合)
 
(同じ利用者による、間の40版が非表示)
行1: 行1:
==UniRxとは==
 
UnityでもReactiveExtensionsを使えるように移植したもの
 
 
==UniRxインストール==
 
https://assetstore.unity.com/packages/tools/integration/unirx-reactive-extensions-for-unity-17276
 
  
 
==メソッド説明==
 
==メソッド説明==
Subscribeはイベント名を入れる
+
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>
 +
 +
==Toggleを使う場合==
 +
<pre>
 +
Observable<bool> toggleOnValueChangedAsObservable;
 +
toggleOnValueChangedAsObservable = toggle.OnValueChangedAsObservable();
 +
toggleOnValueChangedAsObservable
 +
    .Subscribe(value =>
 +
    {
 +
        // 処理
 +
    }).AddTo(disposable);
 +
</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でボタンのクリック回数をテキストに表示する
 
UniRxでボタンのクリック回数をテキストに表示する

2024年9月14日 (土) 05:39時点における最新版

メソッド説明

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);
    }
}

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);

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();

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