Unity寻路报错「SetDestination」は、NavMesh 上に配置されたアクティブなエージェントでのみ呼び出すことができます。

このエラーは、NavMeshAgent が配置されているノードがパス検索グリッド上に配置されていないことを示します。通常、このエラーには次のような問題が伴います。

「NavMesh に十分近くないため、エージェントを作成できませんでした」のような警告。

これは、経路探索エージェントの作成が失敗し、その後の宛先の設定が確実に失敗することを示しています。

このような問題をチェックする必要があります。

  1. SetDestination を呼び出すときに NavMeshAgent が有効かどうか
  2. NavMeshSurface は存在しますか?

すべてが正しく設定されているにもかかわらず、このエラーが報告される場合。おめでとうございます。私も同じ問題に遭遇しました~

私はエディターやテスト APK でこのエラーに遭遇したことはありません (もし遭遇したなら、解決方法を見つけたはずです~)。そして、プロジェクトが立ち上げられたとき、このエラーが大量にバグとして報告されていることがわかりました。とても困惑しましたが、幸いにも NavMeshAgent のソース コードを見つけて、間違いを避けるためのもう少し安全な方法を見つけました。

Agent の経路探索で最も重要な機能の 1 つは障害物回避機能であり、Unity はグループ迂回マネージャー (Detour Crowd Manager) を使用して Agent を管理します。SetDestination を呼び出すことができるという前提は、エージェントがこのバイパス マネージャーに追加されていることです。追加動作をトリガーするには、いくつかの方法があります。

  1. NavMeshSurface の変更 (障害物が穴を掘るなど) がこの動作をトリガーします。
  2. NavMeshAgent::OnEnable は追加を試みます
  3. NavMeshAgent::Warp を呼び出すと追加されます

最初のトリガー動作は経路探索グリッドを変更する必要があり、2 番目はシステムによって呼び出され、最後のトリガー動作は自分でトリガーできます。

ここで、エージェントが配置されているトランスフォームを、transform.position を直接使用するように設定しているかどうかを確認できます。

その場合は、transform.positionで座標を変更する方法を、agent.Warpを使用して変更すると扱いやすいです。

 このようにして、迂回システムを追加しながら、変換の座標も変更されます。

なぜそうなるのかというと、Detour Crowdを初めて追加するときに失敗したのではないかと思いますが、デバッグができないなど失敗の理由はいろいろあるので、このような推測しかできません。この追加動作を再度トリガーしないと、後続のエラーが発生します。ただし、少なくとも、ワープを使用して座標を直接設定すれば、間違いがないことが保証されます。

おすすめ

転載: blog.csdn.net/weixin_36719607/article/details/126711102