1

タイルベースのマップと経路探索用の A* アルゴリズムを備えた小さなゲーム エンジンを作成しました。しかし、2 つのオブジェクトが衝突してウェイポイントをブロックすると、問題が発生します。彼らは反対方向から来ているので、もう動くことができず、次のウェイポイントに到達することはありません. 私はいくつかの可能な解決策を考えました

  • 可動オブジェクトは他の可動オブジェクトと衝突できません
  • ブロックされたタイルにフラグを立てるパスを再計算します
  • 次の空きウェイポイントへのパスを計算し、移動可能なオブジェクトを含むすべてのタイルにブロックされたものとしてフラグを立てます

私は本当に最初の可能性をやりたくありません.それはアクションゲームのようなエンジンではないため、少し粗末です. 最後の 2 つの可能性は、マップ上に移動可能なオブジェクトが多数ある場合、非常に遅くなる可能性があります。どうすればいいと思いますか?ちなみに、最初の可能性は「Stronghold」に実装されており、残りの 2 つは新しい戦略ゲームで見つけることができます。

4

1 に答える 1

1

もちろん、正解は 1 つではありませんが、同様の問題で行ったことを共有できます。

この時点でパススルーが古い学校に見えることに同意します。ただし、オブジェクトがナビゲーション メッシュよりも小さい場合は、パスを実際に無効にすることなく、バウンディング ボックスを使用して衝突を回避できます。衝突回避を小さくし、大きなパスに対してローカルにします。

ゲームでそれがうまくいかない場合は、通常、ブロックを追加するのが最善の方法です。パスファインディングのコストが気になる場合は、衝突が発生するまで待って、一時的に「ブロック」を追加し、再パスすることができます。別のアプローチは、定期的にブロックを挿入してパスを変更することです。これにより、自然に見えるパスが得られ、奇妙に見える「移動する前にお互いに衝突する」ことを回避できます。

コストは、A* アルゴリズムに大きく依存します。アルゴリズムが結果をキャッシュしない場合、ブロックには増分コストがなく、意味のある回数だけ A* を実行できます。例: A* を 1 フレームに 1 回実行し、A* タスクのキューを保持します。

アルゴリズムが結果をキャッシュする場合は、ブロックを移動する前に複数の解を実行できるように、A* 計算をグループ化してみてください。

于 2011-01-18T18:51:14.587 に答える