MRが楽しい

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

MRTKのボタンプレハブにスクリプトからイベントを登録する

本日は MRTK の小ネタ枠です。
MRTKのボタンプレハブをスクリプトからイベントを登録する方法についてです。

MRTKのボタンプレハブ

MRTK には様々なボタンのサンプルが提供されていおり、それらには ButtonConfigHelper コンポーネントが設定されています。

この ButtonConfigHelper コンポーネントを参照してタップ時のイベントの追加・削除やテキストの変更がスクリプトからも行えます。

サンプルコード

スクリプトからボタンにイベントを追加・削除する以下のサンプルスクリプトを作成しました。
・ButtonControl.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// ButtonConfigHelper参照のため
using Microsoft.MixedReality.Toolkit.UI;

public class ButtonControl : MonoBehaviour
{
    [SerializeField]
    private ButtonConfigHelper buttonConfigHelper;

    /// <summary>
    /// スクリプトからボタンの OnClick イベントを登録するサンプル
    /// </summary>
    [ContextMenu("AddButtonListener")]
    public void AddButtonListener()
    {
        buttonConfigHelper.OnClick.AddListener(ChangeText);
    }

    /// <summary>
    /// スクリプトからボタンの OnClick イベントを解除するサンプル
    /// </summary>
    [ContextMenu("RemoveButtonListener")]
    public void RemoveButtonListener()
    {
        buttonConfigHelper.OnClick.RemoveListener(ChangeText);
    }

    /// <summary>
    /// スクリプトからボタンのテキストを変更するサンプル
    /// </summary>
    private void ChangeText()
    {
        buttonConfigHelper.MainLabelText = "CurrentTime : " + System.DateTime.Now.ToString();
    }
}

適当なオブジェクトにサンプルスクリプトを設定して、ボタンの参照を追加します。

動作確認

シーンを再生して動作を確認します。
デフォルトではタップ時のイベントを設定していないため、ボタンをタップしても何もイベントは発生しません。

サンプルスクリプトコンテキストメニューから関数を実行してイベントを登録します。

もう一度ボタンをタップしてみると、イベントが発生してボタンの文字列が変わりました。

永続的リスナーと非永続的リスナーの違い

このとき、スクリプトから登録したイベントは Unity の Inspector 上には表示されません。
Inspector から登録したイベントと、スクリプトから登録したイベントはそれぞれ永続的リスナーと非永続的リスナーという異なる扱いになります。
bluebirdofoz.hatenablog.com