本日はUniRxの小ネタ枠です。
UniRxのAsObservableを使ってMRTKのボタンの押下イベントを受け取る方法です。
前提条件
UniRxとMRTKの環境構築手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com
bluebirdofoz.hatenablog.com
AsObservable
AsObservableはUnityのコールバックイベントをIObservableに変換します。
以下のように使用するとMRTKのボタンのクリックイベントをIObservableとして扱うことができます。
var mrtkButton = GetComponent<Interactable>(); button.OnClickAsObservable().Subscribe(_ => /*ボタン押下時イベント*/);
サンプルスクリプト
MRTKのボタン押下時にテキストメッセージを出力する以下のサンプルスクリプトを作成しました。
・MRTKUniRxButtonTest.cs
using UnityEngine; using Microsoft.MixedReality.Toolkit.UI; using TMPro; using UniRx; public class MRTKUniRxButtonTest : MonoBehaviour { [SerializeField] private Interactable mrtkButton; [SerializeField] private TMP_InputField resultText; void Start() { // 起動と同時にボタン押下イベントを登録 mrtkButton.OnClick.AsObservable().Subscribe(_ => { resultText.text = "MRTK Button Clicked"; }) // オブジェクト破棄のタイミングでボタン押下時イベントを解除 .AddTo(this); } }
適当なオブジェクトにスクリプトを設定し、Interactableコンポーネントを持つボタンオブジェクトへの参照を設定します。
シーンを再生してボタンを押下するとメッセージが表示されました。
AsObservableを使った場合はUniRxのオペレータを組み合わせて利用できるため、解除などの記述を簡潔にできます。
UniRxを利用しない場合、以下のようにクリックイベントを登録します。
・MRTKButtonTest.cs
using UnityEngine; using Microsoft.MixedReality.Toolkit.UI; using TMPro; public class MRTKButtonTest : MonoBehaviour { [SerializeField] private Interactable mrtkButton; [SerializeField] private TMP_InputField resultText; void Start() { // 起動と同時にボタン押下イベントを登録 mrtkButton.OnClick.AddListener(() => { resultText.text = "MRTK Button Clicked"; }); } void OnDestroy() { // オブジェクト破棄のタイミングでボタン押下イベントを解除 mrtkButton.OnClick.RemoveAllListeners(); } }