MRが楽しい

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

MRTKv2.xを使ったMetaQuest3向けアプリでハンドレイのポインタが正常に動作しない問題 その3

本日はMRTKv2.xの調査枠です。
MRTKv2.xを使ったMetaQuest3向けアプリでハンドレイのポインタが正常に動作しない問題が発生したので情報を記事に残します。
今回は社内の有識者に本問題の一旦の回避策を教えて頂いたので記録します。

前回記事

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

問題の原因

本問題はMeta XR SDKのv66で以下のOVRHand.csの初期化処理に修正が入ったことが原因です。

Packages/Meta XR Core SDK/Scripts/Util/OVRHand.cs

v66ではハンド用ポインターのHierarchy上の構成が異なるため、MRTKのハンドレイのポインターで齟齬が発生します。
・v65のOVRHand.cs

    private void Awake()
    {
        _pointerPoseGO = new GameObject($"{HandType} {nameof(PointerPose)}");
        _pointerPoseGO.hideFlags = HideFlags.HideAndDontSave;
        PointerPose = _pointerPoseGO.transform;
        if (_pointerPoseRoot != null)
        {
            PointerPose.SetParent(_pointerPoseRoot, false);
        }

        if (RayHelper != null)
        {
            RayHelper.transform.SetParent(PointerPose, false);
        }
        GetHandState(OVRPlugin.Step.Render);
    }

・v66のOVRHand.cs

    private void InitializePointerPose()
    {
        _pointerPoseGO = new GameObject($"{HandType} {nameof(PointerPose)}");
        _pointerPoseGO.hideFlags = HideFlags.HideAndDontSave;
        if (_pointerPoseRoot != null)
        {
            PointerPose.SetParent(_pointerPoseRoot, false);
        } else
        {
            PointerPose.SetParent(transform, false); // 影響箇所
        }
    }

    private void Awake()
    {
        if( _pointerPoseGO == null )
        {
            InitializePointerPose();
        }

        if (RayHelper != null)
        {
            RayHelper.transform.SetParent(PointerPose, false);
        }
        GetHandState(OVRPlugin.Step.Render);
    }


回避策

当該の初期化処理をコメントアウトなどで無効化することで問題の発生を回避することができます。

修正を行ってアプリを実行すると、以下の通り正常な位置からハンドレイのポインターが飛ぶようになります。