前の記事のスクリプトで、ナビメッシュエージェントに目的地への経路上でワープさせてみます。
second += Time.deltaTime;
if (second >= 3f)
{
second = 0f;
Vector3 pos = corners[Random.Range(0, corners.Length)]; // ランダムで選んだコーナーポイントの位置
agent.Warp(pos); // ワープさせる
Debug.Log(agent.pathPending + " " + agent.destination + " " + pos + " " + transform.position);
}
3秒ごとに、ランダムで選んだコーナーポイントへワープさせます。すると、ワープ後にナビメッシュエージェントがその場を動かなくなりました。
コンソールを見ると、目的地がワープさせた地点に変更されています。Warp()を呼んだフレームでナビメッシュエージェントはワープ先に移動していて、経路探索も終わっているようです。
ワープ後に目的地を再設定してみると、冒頭のGif画像のように、ナビメッシュエージェントが目的地への移動を継続するようになりました。この場合はpathPendingはtureなので、経路探索中だと思います。目的地へワープしたときにはfalseになります。
そこで、ワープ後に目的地を再設定するのでなく、保存したパスを設定するようにしてみました。
NavMeshPath path;
// ---
// 初めて目的地を設定するとき
path = agent.path; // パスを保存
// ---
second += Time.deltaTime;
if (second >= 3f)
{
second = 0f;
Vector3 pos = corners[Random.Range(0, corners.Length)]; // ランダムで選んだコーナーポイントの位置
agent.Warp(pos); // ワープさせる
//agent.destination = goal.position; // ゴールを再設定する
agent.path = path; // パスを設定
Debug.Log(agent.pathPending + " " + agent.destination + " " + pos + " " + transform.position);
}
すると、目的地への移動が継続されながら、pathPendingがfalseのままになりました。trueになるのは、初めて目的地を設定するときだけでした。pathを設定するとその都度経路探索をしなくて済むようです。