MRが楽しい

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

MRTKv2.xを使ってMetaQuest3向けのUnityプロジェクト作成を行う その28(シーンモデルを利用できるかチェックする)

本日はMetaQuest3の技術調査枠です。
MRTKv2.xを使ってMetaQuest3向けのUnityプロジェクト作成を行う手順を記事にします。
本記事はシーンモデルを利用できるかチェックする手順です。

前提条件

本記事では以下の記事で作成したシーンモデルの利用を有効にしたUnityプロジェクトを基に設定を行います。
bluebirdofoz.hatenablog.com

シーンモデルの情報を参照する

スクリプトからシーンモデルの情報を参照するにはMRUK、MRUKRoomおよびMRUKAnchorクラスを参照します。
developer.oculus.com

MRUKは以下のUnityEventを設定できます。
本イベントを登録することで各シーンモデルのMRUKRoomインスタンスを受け取ることができます。
・SceneLoadedEvent:全てのシーンモデルの読み込み完了時に発生するイベント
・RoomCreatedEvent:シーンモデルの作成完了ごとに発生するイベント
・RoomUpdatedEvent:シーンモデルの更新ごとに発生するイベント
・RoomRemovedEvent:シーンモデルの削除ごとに発生するイベント

RoomCreatedEvent、RoomUpdatedEvent、RoomRemovedEventの引数で引き渡されるMRUKRoomインスタンスではシーンモデルの情報の参照のほか、操作メソッドにアクセスできます。

シーンモデルを利用できるかチェックする

MRUKRoomインスタンスのIsPositionInRoomメソッドを利用すると、特定の座標が読み込んだシーンモデルに含まれるかチェックできます。

public void SetTextRoomCreatedEvent(MRUKRoom roomInfo)
{
    // メインカメラがルーム内にいるかどうかを確認する
    bool isPositionInRoom = roomInfo.IsPositionInRoom(Camera.main.transform.position);
    // ……
}

本メソッドを利用して現在プレイヤーがシーンモデルを利用可能かチェックすることができます。

サンプルスクリプト

MRUKの各種イベントを受け取り、その結果をテキスト表示する以下のサンプルスクリプトを作成しました。

using Meta.XR.MRUtilityKit;
using TMPro;
using UnityEngine;

public class TextControl : MonoBehaviour
{
    [SerializeField]
    private TMP_Text text;
    
    public void SetTextLoadedEvent()
    {
        // テキストを改行して追加する
        text.text += "Scene Loaded." + System.Environment.NewLine;
    }

    public void SetTextRoomCreatedEvent(MRUKRoom roomInfo)
    {
        // テキストを改行してルーム情報を追加する
        text.text += "Room Created. Room ID: " + roomInfo.name + System.Environment.NewLine;
        // メインカメラがルーム内にいるかどうかを確認する
        bool isPositionInRoom = roomInfo.IsPositionInRoom(Camera.main.transform.position);
        text.text += "Is Position In Room: " + isPositionInRoom + System.Environment.NewLine;
    }
    
    public void SetTextRoomUpdatedEvent(MRUKRoom roomInfo)
    {
        // テキストを改行してルーム情報を追加する
        text.text += "Room Updated. Room ID: " + roomInfo.name + System.Environment.NewLine;
    }
    
    public void SetTextRoomRemovedEvent(MRUKRoom roomInfo)
    {
        // テキストを改行してルーム情報を追加する
        text.text += "Room Removed. Room ID: " + roomInfo.name + System.Environment.NewLine;
    }
}

サンプルスクリプトの各メソッドをMRUKのUnityEventに設定して準備は完了です。

ビルドと動作確認

これで設定は完了です。
以下の記事を参考にプロジェクトのビルドとQuest3へのデプロイを実行してください。
bluebirdofoz.hatenablog.com

MetaQuest3でデプロイしたアプリを起動します。
以下の通り、デバイスに含まれるシーンモデルごとにCreatedEventが呼び出されます。
プレイヤーが対象のシーンモデル内にいる場合はIsPositionInRoomでTrueが返ることで確認できます。