Unity ナビゲーション システム その他の注意事項

今すぐパスファインディングを停止する

  • agent.isStopped=true を使用すると、経路探索を停止できますが、遅延が大きく、視覚的なエクスペリエンスが非常に悪くなります。

  • NavMeshAgent コンポーネントを無効にすることで、agent.enabled=false を使用してパス検索をすぐに停止します。コンポーネントが無効になっているため、障害物回避の機能が失われるなど、他の問題が発生する可能性があります。

  • agent.ResetPath() を使用すると、isStopped と同じようにパス検索を停止できますが、大きな遅延が発生します。

  • agent.destination = agent.transform.position; を使用する

  • carve を使用するには、NavMeshObstacle コンポーネントをオブジェクトに追加し、停止する必要があるときにこのコンポーネントを有効にし、Carve を true に設定し、同時に NavMeshAgent をオフにする必要があります (NavMeshObstacle と NavMeshAgent は共存できません)。

navAgent.SetDestination(ポイント)

ターゲット ポイントに到達できない場合は、現在の Navmesh のターゲット ポイントに最も近い到達可能なポイントが割り当てられます。到達可能なポイントがない場合、これは false を返します。

SetDestination の遅い問題

多数のキャラクターが同時にパスを探している場合、カーブの再構築に伴い、パスファインディングに時間がかかり、結果としてキャラクターがスタックしてしまいますが、これは大きな値を設定することで回避できますNavMesh.pathfindingIterationsPerFrame。 .
SetDestination 自体は非同期メソッドであり、Unity はデフォルトでフレームごとの実行数を制限します。上記の設定により、1 フレームあたりの実行回数は増えますが、基本的にはシングル スレッド方式です。キャラクター数が多い場合でも、ゲームのフレームレートは大幅に低下します。

到達可能な判断

 NavMeshPath path = new NavMeshPath();
                    agent.CalculatePath(targetPos, path);
                    if (path.status == NavMeshPathStatus.PathComplete)
                    {
    
    
                        //reachable
                        agent.SetPath(path);
                        //agent.SetDestination(targetPos);//already CalculatePath,so use SetPath is more effective than SetDestination
                    }
                    else
                    {
    
    
                        //not reachable
                    }

複数の経路探索レイヤーを設定する

  • たとえば、パスファインディング レイヤに一般道路と橋が含まれている必要があります。
  • 組み込みのデフォルト レイヤーは、Walkable、Not Walkable、および Jump です。Navigation->Areas の下に新しいレイヤー Bridge を追加します。このインターフェイスの各レイヤの色は、最終的にベイク メッシュのギズモ表示に反映されることに注意してください。プロセスは次のとおりです。
    • 1. ブリッジが配置されているオブジェクトに NavMeshModifier を追加し、その Area Type プロパティを Bridge に設定します。ブリッジが配置されているオブジェクトを選択したら、[ナビゲーション] -> [オブジェクト] を開き、そのナビゲーション エリアを [ブリッジ] に設定します。その他の歩行エリアではナビゲーション エリアを歩行可能に設定し、障害物エリアではナビゲーション エリアを歩行不可に設定します
    • 2. NavMeshSurface が歩行領域をベイクします
    • 3. NavmeshAgent の歩行可能エリアを次のように設定します。agent.areaMask = 1 << 0 | 1 << 3;
  • 指定されたポイントから navmesh 内の最も近いポイントを見つけます

NavMesh.SamplePosition(Vector3 sourcePosition, out AI.NavMeshHit hit, float maxDistance, int areaMask),bool True if the nearest point is found.参照: NavMesh.SamplePosition

NavMeshAgent パスファインディング ユニット オーバーラップ( 大量带有NavMeshAgent的单位寻路到相同点时,在寻路过程中会重叠,到达目标点后也会重叠)

方法 1、障害物回避を使用します。

ドキュメントには、障害物回避にはrvoを使用すると書かれていますが、効果はあまり良くなく、異なる物体間の衝突による押しや揺れが非常に深刻であることが測定されています。
各ユニットをより適切に終点に到達させたい場合は、各ユニットの終点を同じポイントに設定しないでください。各ユニットの経路探索半径に従って、各キャラクターが到達する対応する位置を事前にランダムに設定する必要がある場合があります。 character 、パスファインディング時に互いにプッシュしないようにします。

方法 2、NavMeshObstacle を使用して穴を掘ります。

特定のプロセスは、NavMeshAgent (障害物回避が有効になっていない) と NavMeshObstacle コンポーネントを同時にオブジェクトに掛けることです (2 つのコンポーネントを同時に有効にすることはできません。そうしないと、制御不能なテレポーテーションが発生することに注意してください)。移動するときは NavMeshObstacle コンポーネントをオフにし、経路探索のために NavMeshAgent を有効にします。ターゲット ポイントに到達したら、最初に NavMeshAgent をオフにしてから、NavMeshObstacle コンポーネントを有効にして穴を掘ります。これにより、Navmesh 道路ネットワークが再構築され、他のオブジェクトの経路探索ルートも変更し、最終的に回避する ターゲットの周りに包囲円を形成します。

上記の内容によると、オブジェクトを掘った後に経路探索を再開するには、NavMeshObstacle を無効にし、NavMeshAgent を有効にする必要があることがわかっています。関連する擬似コードは次のとおりです。

navObstacle.enabled=false;
navObstacle.carving=false;
navAgent.enabled=true;

しかし、実際には、この場合、オブジェクトの制御不能なテレポーテーションも発生します. その理由は、NavMeshObstacle の無効化がすぐに完了しないためです. 上記のコードにより、現在の NavMeshObstacle と NavMeshAgent がオンになります.フレーム。したがって、NavMeshObstacle を無効にした後、NavMeshAgent を有効にする前に少なくとも 1 フレーム遅延する必要があります。

参考:https://github.com/llamacademy/ai-series-part-33

他の

git のドット ベースのナビゲーション パスファインディング: https://github.com/dotsnav/dotsnav

おすすめ

転載: blog.csdn.net/iningwei/article/details/130430312