【Unity】ナビメッシュの経路を取得する

投稿者: | 2020-07-17

ナビメッシュエージェント(赤いカプセル)が目的地(青いキューブ)へ向かうまでの経路を取得してみます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class CornerTest : MonoBehaviour
{
    [SerializeField] Transform goal;
    [SerializeField] GameObject sphere;

    NavMeshAgent agent;
    Vector3[] corners;
    bool setUp = false;

    // Start is called before the first frame update
    void Start()
    {

        agent = GetComponent<NavMeshAgent>();
        agent.destination = goal.position;

    }

    // Update is called once per frame
    void Update()
    {
        if (!setUp && !agent.pathPending)
        {
            setUp = true;

            corners = agent.path.corners; // コーナーポイントを取得

            // コーナーポイントに緑色の球を配置
            for (int n = 0; n < corners.Length; n++)
            {
                var s = Instantiate(sphere, corners[n], sphere.transform.rotation); // 球を生成
                s.name = n + ""; // 球の名前をインデックスにする
            }
  
        }
    }
}

経路は、NavMeshPath.cornersを使うと曲がり角の配列の形で得られます。今回はすべての曲がり角に緑色の球を配置してみました。

配列にはスタート地点とゴール地点も含まれます。

スタート地点
ゴール地点

また、緑色の球の名前を配列のインデックスにすると、スタート地点からゴール地点まで順番に並んでいるのがわかります。

経路の途中はナビメッシュの角を結んだような状態です。経路が曲がる部分のナビメッシュの境界は、下のように角が取れたような形になるので、この部分には緑色の球が密集します。

曲がり角を取得できないとき

曲がり角の取得をStart()でやると、配列にスタート地点しか含まれていない状態になりました。

マニュアルには、NavMeshAgent.destinationで目的地を設定した後に経路が利用可能になるのに数フレームかかるかもしれないというようなことが書かれています。利用可能かはpathPendingを使うとわかるようです。

pathPendingの値は開始直後にtrueで、その後は目的地に着いた後もfalseのままでした。

目的地に着いた時に新しい目的地を設定してみると、再度1フレームだけtrueになって、その後またfalseになりました。経路探索中はtrueになるということでしょうか。

Update()でpathPendingがfalseの時に曲がり角を取得するとうまくいきました。

コメントを残す

メールアドレスが公開されることはありません。