私が取り組んでいるグリッドベースのゲームで、グリッドの複数のタイルを占めるオブジェクトを追加したいと思います。この種のオブジェクトのパスを見つけるためのアルゴリズムや手法はありますか?
私が取り組んでいるグリッドベースのゲームで、グリッドの複数のタイルを占めるオブジェクトを追加したいと思います。この種のオブジェクトのパスを見つけるためのアルゴリズムや手法はありますか?
回答:
一般に、既存のパスファインディングアルゴリズムを幅に依存するように調整します。これは主にA *を適応させることを意味しますが、ゲームはグリッドベースであるため、脂肪の迷路を解決するためのアルゴリズムを見つけることができます役立つ場合があります。
A *の場合、最も基本的な解決策は、移動ルールに従って、幅のアサーションを計算に追加することです。ただし、これによりパスファインディングコードが混乱し、通常サイズのエンティティのパスファインディングが遅くなります。
または、グリッドをノードベースのパスファインディングネットワークと見なすこともできます。大規模なエンティティの場合は、サイズを考慮したセカンダリネットワークを作成し、それを移動とパスファインディングに使用できます。これには、大きなエンティティに合わせてパスファインディングを調整して期待どおりの動作をさせることができるという利点がありますが、シーンごとに複数のマップを作成してメモリに保持するため、モバイルプラットフォームのゲームに影響を与える可能性があります。
これらの方法のどちらも目的に合わない場合、ナビゲーションメッシュ パスファインディングアルゴリズムでインスピレーションを探すことができます。これは、本質的に幅を認識します。
1つのオプションは、次のようにオブジェクトをグリッドに「ペイント」することにより、オブジェクトのサイズを考慮した2番目のグリッドを計算することです。これが元のグリッドです:
#########
#..b....#
#.#.....#
#.####..#
#.......#
#.......#
#..#.#..#
#a.#.#..#
#########
2x2オブジェクトがからa
に取得できるかどうかを確認しb
ます。2つ目のグリッドを計算します。ここでは、壁を作成するたびに(#
)、壁の上部と左側に壁を追加し(x
)、各単一の壁セグメントを2x2のセグメントに変換します。今それは次のようになります:
xxxxxxxxxx
x#########
x#xxb...x#
x#x#xxx.x#
x#x####.x#
x#......x#
x#.xxxx.x#
x#.x#x#.x#
x#ax#x#xx#
x#########
次に、グリッド自体がサイズを考慮に入れるため、オブジェクトを1x1として扱うことにより、このグリッド上でパスファインドを実行できます。
munificentの回答を拡張して単一のサポートグリッドを格納できます。これは、オブジェクトサイズごとに通過可能性を格納するのではなく、この場所と最も近いバリアの間のハーフタイル幅の数を記録する距離フィールドを格納します。(または、何もヒットせずにこのタイルの中央に配置できる最大のオブジェクトの幅)
このグリッドは、マップを空のスペースでマップサイズよりも大きい整数に、壁のサイトでは-1に初期化することで入力できます。次に、各タイルを繰り返し、> 0をその隣の最小値に2を加えた値に設定します。
次に、パスファインディングアルゴリズムの中で、
if (!IsPassable(PassabilityMap[x, y])) continue;
と
if (DistanceToObstacleMap[x, y] < pathfindingAgent.size) continue;
これで、単一のマップで任意のサイズのユニットのパスファインディングを処理できるようになり、格納/チェックの可否は、タイルごとに1ブールの場合と同等のコストで維持されます。