MRが楽しい

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

引数指定のUnityEventを介してMRTKのSliderから値を取得する

本日は MRTK の技術調査枠です。
引数指定の UnityEvent を介して MRTK の Slider から値を取得する手順を記事にします。

前提条件

前回記事の続きです。
bluebirdofoz.hatenablog.com

引数指定のUnityEvent

UnityEvent クラスを継承した新規クラスを作成すると、UnityEvent で動的に引数を渡すことができます。
docs.unity3d.com

以下の記事でも利用例を記述しています。
bluebirdofoz.hatenablog.com

UnityEventを仲介する

MRTK のスライダーイベントはイベントデータとして SliderEventData を渡すため、float の値を利用する関数を直接呼び出すことはできません。
UnityEvent を利用して UnityEvent に変換する関数を作成することで、Slider のイベント発生時に float の値を利用する関数を呼び出すことができます。

スクリプト例として以下のスクリプトを作成しました。
・SettingSliderEvent.cs

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

// SliderEventDataアクセスのため
using Microsoft.MixedReality.Toolkit.UI;

// UnityEvent を利用するため Events を追加
using UnityEngine.Events;

// 引数に float を受け取る UnityEvent<T0> の継承クラスを作成する
// Inspector ビューに表示させるため、Serializable を設定する
[System.Serializable]
public class ExtFloatSliderEvent : UnityEvent<float>
{
}

public class SettingSliderEvent : MonoBehaviour
{
    // 作成した継承クラスで UnityEvent を登録する
    /// <summary>
    /// スライダー値変更時実行処理
    /// </summary>
    [SerializeField, Tooltip("スライダー値変更時実行処理")]
    private ExtFloatSliderEvent SetExtFloatSliderEvent;

    public void OnSliderUpdated(SliderEventData eventData)
    {
        Debug.Log("SliderValue:" + eventData.NewValue.ToString());
        SetExtFloatSliderEvent.Invoke(eventData.NewValue);
    }
}

合わせて受け取った float 値をデバッグログに表示するパブリック関数を持つスクリプトを作成しました。
・DebugLogValue

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

public class DebugLogValue : MonoBehaviour
{
    /// <summary>
    /// 受け取ったfloat値をデバッグログに表示する
    /// </summary>
    /// <param name="a_value"></param>
    public void ShowFloatValue(float a_value)
    {
        Debug.Log("ShowFloatValue : " + a_value.ToString());
    }
}

2つのスクリプトを適当なオブジェクトにアタッチします。
f:id:bluebirdofoz:20210115192736j:plain

前回記事と同様に、PinchSlider のイベントには SliderEentData を引数とする SettingSliderEvent.cs の関数を指定します。
f:id:bluebirdofoz:20210115192745j:plain

次に呼び出される SettingSliderEvent.cs のイベントに float 値を受け取る関数を指定します。
f:id:bluebirdofoz:20210115192755j:plain

シーンを再生して動作を確認します。
Slider の変化値を float 値を受け取る関数に UnityEvent を介して渡すことができました。
f:id:bluebirdofoz:20210115192803j:plain