MRが楽しい

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

UniRxのAsObservableを使ってMRTKのObjectManipulatorの掴みイベントを受け取る

本日はUniRxの小ネタ枠です。
UniRxのAsObservableを使ってMRTKのObjectManipulatorの掴みイベントを受け取る方法です。

前提条件

UniRxとMRTKの環境構築手順は以下の記事を参照ください。
bluebirdofoz.hatenablog.com
bluebirdofoz.hatenablog.com

今回は以下の記事で作成したObjectManipulatorを使ってオブジェクトを掴めるようにしたシーンを利用します。
bluebirdofoz.hatenablog.com

ObjectManipulator

MRTKのObjectManipulatorは、片手か両手を使ってオブジェクトの移動、回転、拡大縮小を行うコンポーネントです。
ObjectManipulatorは様々な入力に対応しているため、多関節ハンドや視線レイとタップ、モーションコントローラなどでも機能します。
learn.microsoft.com

AsObservable

AsObservableはUnityのコールバックイベントをIObservableに変換します。
以下のように使用するとMRTKの掴みイベントをIObservableとして扱うことができます。

var objectManipulator = GetComponent<ObjectManipulator>();
objectManipulator.OnManipulationStarted.AsObservable().Subscribe(_ => /*掴み開始時イベント*/);
objectManipulator.OnManipulationEnded.AsObservable().Subscribe(_ => /*掴み終了時イベント*/);
objectManipulator.OnHoverEntered.AsObservable().Subscribe(_ => /*ポインタヒット時イベント*/);
objectManipulator.OnHoverExited.AsObservable().Subscribe(_ => /*ポインタ外し時イベント*/);

サンプルスクリプト

ObjectManipulatorの各種イベントが発生した時にログ出力する以下のサンプルスクリプトを作成しました。
・MRTKUniRxObjectManipulatorTest.cs

using Microsoft.MixedReality.Toolkit.UI;
using UniRx;
using UnityEngine;

public class MRTKUniRxObjectManipulatorTest : MonoBehaviour
{
    [SerializeField] private ObjectManipulator _objectManipulator = default;
    
    private void Start()
    {
        _objectManipulator.OnManipulationStarted.AsObservable()
            .Subscribe(_ => Debug.Log("ManipulationStarted"))
            .AddTo(this);
        
        _objectManipulator.OnManipulationEnded.AsObservable()
            .Subscribe(_ => Debug.Log("ManipulationEnded"))
            .AddTo(this);
        
        _objectManipulator.OnHoverEntered.AsObservable()
            .Subscribe(_ => Debug.Log("HoverEntered"))
            .AddTo(this);
        
        _objectManipulator.OnHoverExited.AsObservable()
            .Subscribe(_ => Debug.Log("HoverExited"))
            .AddTo(this);
    }
}

適当なオブジェクトにスクリプトを設定し、ObjectManipulatorコンポーネントを持つオブジェクトへの参照を設定します。

シーンを再生してオブジェクトを掴んだり話したり、ポインタを当て外しすると各イベントのメッセージが表示されます。

AsObservableを使った場合はUniRxのオペレータを組み合わせて利用できるため、解除などの記述を簡潔にできます。