ナビメッシュエージェント(赤いカプセル)が目的地(青いキューブ)へ向かうまでの経路を取得してみます。
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の時に曲がり角を取得するとうまくいきました。