MRが楽しい

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

HoloLens2でホロモンアプリを作る その38(NavMeshAgentによる追跡結果の成否を判定する)

本日はアプリ作成枠です。
HoloLens2でホロモンアプリを作る進捗を書き留めていきます。
f:id:bluebirdofoz:20210504233348j:plain

今回はNavMeshAgentによる追跡結果の成否を判定するメモです。

NavMeshAgentによる追跡結果の成否を判定する

ホロモンアプリでは NavMeshAgent を使って現実空間でホロモンが人を追跡できるようにしています。
bluebirdofoz.hatenablog.com

ただし、リアルタイムに計測した現実空間のメッシュでは想定外の障害物やメッシュの抜けなどが発生するため、目標の位置に辿り着けないことも多発します。
NavMeshAgent はその状況で到達可能な位置に到達した時点で追跡を完了するので、実際に目標位置に到達できたかは別に判定する必要があります。

以下の通り、移動が完了した時点でターゲットのポジションまでの直線距離を計算して到達できたか判定するコードを追加しました。
・HoloMonModeLogicTargetTracking

    // ----- 前略 -----

                // 現在の速度を取得する
                float agentSpeed = HoloMonComponentsSingleton.Instance.GetNavMeshAgent().velocity.magnitude;

                // 移動中か否か
                if (agentSpeed <= 0.0f)
                {
                    // 移動していないならカウントアップ
                    StopCheckCount++;

                    // 敷居値回数以上停止していれば停止と判定する
                    if (StopCheckCount > StopCheckThreshold)
                    {
                        // 現時点のターゲットまでの距離
                        float targetDistance = Vector3.Distance(
                            p_TargetPoint.position,                                                  // ターゲットの座標
                            HoloMonComponentsSingleton.Instance.GetNavMeshAgent().transform.position // Agentの現在座標
                            );

                        // ターゲットに到達したと判定する距離(ここではNavMeshAgentに指定した停止距離をそのまま利用)
                        float stoppingDistance = HoloMonComponentsSingleton.
                            Instance.GetNavMeshAgent().stoppingDistance;

                        // 移動していなければ追跡を停止し、到達したか否かの判定を行う
                        if (targetDistance <= stoppingDistance)
                        {
                            // 到達場所が停止距離以内であれば追跡達成と判定する
                            Debug.Log("Tracking Achievement");
                            DisableSetting(HoloMonModeStatus.Achievement);
                        }
                        else
                        {
                            // 到達場所が停止距離以遠であれば追跡失敗と判定する
                            Debug.Log("Tracking Missing");
                            DisableSetting(HoloMonModeStatus.Missing);
                        }
                    }
                }

    // ----- 後略 -----

f:id:bluebirdofoz:20210504233410j:plain

NavMeshAgent の destination は到達可能な範囲での座標を指してしまうため、距離の計算には直接ターゲットとしているトランスフォームを指定しています。
docs.unity3d.com

シーンを再生して動作を確認してみます。
ホロモンに「おいで」と言って、プレイヤーを追跡させます。
f:id:bluebirdofoz:20210504233437j:plain

間に障害物などがなく、目の前まで追跡できた場合は追跡達成と判定されました。
f:id:bluebirdofoz:20210504233449j:plain

次に障害物があったり、メッシュが抜けていてプレイヤーに到達できないパターンを試してみます。
この場合は追跡失敗と判定されました。
f:id:bluebirdofoz:20210504233503j:plain