MRが楽しい

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

MRTKでHoloLens2の空間メッシュの表示方法や有効無効を動的に切り替える その3

本日はMRTKの小ネタ枠です。
MRTKで空間メッシュの表示方法や有効無効を動的に切り替える方法を記事にします。
今回は初期状態を無効状態にして空間メッシュを有効に切り替える方法です。

前回記事

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

SpatialAwarenessの設定

MRTKを利用してHoloLens2アプリを作成する場合、空間メッシュはSpatialAwarenessの設定で管理されます。
空間メッシュの起動時の動作は[Startup Behavior]で変更できます。
デフォルト値は[Auto Start]で、この場合アプリ起動時に自動で空間メッシュの観測が開始されます。
learn.microsoft.com

初期状態では空間メッシュを無効にしておき、任意のタイミングで空間メッシュの観測を開始したい場合は[Manual Start]を設定します。
観測を開始したいタイミングでResume()を実行することで観測が開始されます。
learn.microsoft.com

ResumeObservers()またはSuspendObservers()を利用することで使用しているXRプラグインに関わらず、CoreServices.SpatialAwarenessSystemから変更可能です。

// 全てのメッシュオブザーバの監視を再開する
CoreServices.SpatialAwarenessSystem.ResumeObservers();

// 全てのメッシュオブザーバの監視を停止する
// ※ メッシュの判定は最後に更新された状態で残る
CoreServices.SpatialAwarenessSystem.SuspendObservers();

サンプルスクリプト

新たにSpatialAwarenessの観測開始と停止を切り替える関数を持った以下のスクリプトを作成しました。
・SpatialAwarenessSuspendSwitch.cs

using UnityEngine;

using Microsoft.MixedReality.Toolkit;

public class SpatialAwarenessEnableSwitch : MonoBehaviour
{
    public void SwitchResume()
    {
        // 全てのメッシュオブザーバの監視を再開する
        CoreServices.SpatialAwarenessSystem.ResumeObservers();
    }

    public void SwitchSuspend()
    {
        // 全てのメッシュオブザーバの監視を停止する
        // ※ メッシュの判定は最後に更新された状態で残る
        CoreServices.SpatialAwarenessSystem.SuspendObservers();
    }
}

またプロファイルを編集して各種オブザーバの[Startup Behavior]を[Manual Start]に変更しておきます。

作成したサンプルスクリプトを適当なオブジェクトにアタッチし、シーンに配置したボタンから関数を呼び出せるようにしました。


HoloLens2上での動作確認

アプリケーションをビルドしてHoloLens2にデプロイします。
アプリ起動時は以下のように空間メッシュの観測が開始されていない状態で起動します。

Resumeボタン押下で空間メッシュの観測が開始されます。

Suspendボタン押下で空間メッシュの観測が停止します。
観測による更新が停止するだけで空間メッシュの状態は最後の更新時の状態が維持される点に注意してください。

空間メッシュの有効無効も切り替えたい場合は以下のようにEnable, Disableの変更も同時に行う必要があります。

using UnityEngine;

using Microsoft.MixedReality.Toolkit;

public class SpatialAwarenessSuspendExpandSwitch : MonoBehaviour
{
    public void SwitchResume()
    {
        // 全てのメッシュオブザーバの監視を再開する
        CoreServices.SpatialAwarenessSystem.Enable();
        CoreServices.SpatialAwarenessSystem.ResumeObservers();
    }

    public void SwitchSuspend()
    {
        // 全てのメッシュオブザーバの監視を停止する
        // ※ Disable()を呼び出すことでメッシュの判定も停止する
        CoreServices.SpatialAwarenessSystem.SuspendObservers();
        CoreServices.SpatialAwarenessSystem.Disable();
    }
}

Tips

プロファイルの[Enable Spatial Awareness System]のチェックを外した場合、後から空間メッシュの観測を有効にすることはできません。

動的に空間メッシュの有効無効を切り替えたい場合は本項目にはチェックを入れておく必要があります。