MRが楽しい

MRやVRについて学習したことを書き残す

UniRxのAsObservableを使ってMRTKのボタンの押下イベントを受け取る

本日は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();
    }
}