障害物をパスファインディングするにはどうすればよいですか?


10

次の状況を最もよく表す方法-エージェント(@)は目標($)に到達する必要があります。パスは堀(~~~)によってブロックされています。障害物を横切ることを可能にするレーキ(または水上ウォーキングブーツのような他のデバイス)が利用可能です。

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

適切からpathfindする方法@$何らすぐに利用できるパスがない?提供 私の道はコストだけでなく前提条件も持っているべきですか?

UPD:問題は、目標にアクセスできず、レーキがマップ上の多くの可能なオブジェクトの1つにすぎないことです。次に質問は、「すくいが必要であることをエージェントに理解させるにはどうすればよいか」です。


この問題を解決するためのアプローチに影響を与えるため、ユースケースを明確にする必要があると思います。たとえば、ユースケースが敵のパスを計算することである場合は、おそらく最初に目標に到達できるかどうかを確認し、そうでない場合は敵がレーキを取得し(つまり、レーキが目標です)、最初のパスにパスファインドします。再び目標。
ジョッキング

回答:


6

一連の目標について考えています。パスファインディングには注釈を付ける必要があります。

  • 目標から始める get $
  • パスを見つけてみてください$-パスはウォーターウォーキング機能が必要な状態で存在しています。
  • プッシュゴールget waterwalking
  • ゴールスタックは今です get waterwalking, get $
  • どういうわけか、熊手が水路を提供していることがわかりました。名前をボートに変更しましょう。
  • 熊手への道。最上位の目標を達成し、スタックからポップしましたget $。目標はです。
  • への道$-今、私たちは能力を持ち、目標を達成することができます。

1
+1私は自分のゲームで同様のことを行い、しばらくの間、ユニットタスクパスファインディングの下でそれについて小さな投稿を書きました。
MichaelHouse

@ byte66は、rakeを使用しないパスがある場合の特別なケースを処理しませんが、rakeを使用するとパスが短くなります
Ali1S232

@Gajetあなたは正しい。そのためには別のアプローチが必要になると思います。
zzandy

1
それは、追加のコストを追加するだけの問題です。水に遭遇したとき、水歩きアイテムを道に入れるコストを追加します。A *は、最も安い道になるまで水上ウォーキングをスキップします。
MichaelHouse

3

パス全体を検索するのは、グラフ上の最短パスを検索するだけです。問題を解決するために適用する必要がある唯一の変更は、追加のエッジ(ボートが通過できるパスを表す)を追加することと、単純なパス検索アルゴリズムを実行することです。BFS、ダイクストラ、またはA *のどちらを使用するかは関係ありません。通常のパス検索アルゴリズムをいくつかのエッジを追加して実装するだけです。グラフでのパス検索の詳細については、Wikiページを確認してください


+1レーキを水への一方向のリンクにし、水と地面の間を一方向にリンクします。
Laurent Couvidou 2012年

形状検索とフィーチャー検索をどのようにバインドするかが明確にわかりません。行く方法no path from @ to $goto rake, bring it to water, place it, goto $
zzandy

@zzandyパス検索中、各タイルについて、可能であれば、最も近いタイルに移動します。現在のノードがレーキの場合、川の反対側からノードを直接追加してリストを開くことができるという条件を追加するだけです。
Ali1S232

しかし、デバイスを持ち運べる場合はどうでしょうか?私はそれが彼の意味するものだと思った(そしてそれゆえ私の答えも。)
kaoD

はい、私はデバイスがキャリー可能である必要があることを意味します。@kaoD、あなたの答えには、エージェントが熊手が必要だというアイデアを得るときのステップは含まれていません。
zzandy

2

私はこれをある種のビヘイビアツリーソリューションで行います-あなたは目標に向かって進み、A *を妨げているすべての障害に注意してください。失敗した場合、それらの障害を克服するのに役立つオブジェクトがあるかどうかを確認します。その場合、そのオブジェクトへのパスです。繰り返す。これは、ツールを使用するというアイデアを得る前に、エージェントが目標にパスして失敗する必要があることを意味します。特に、すべてをチェックする必要があるタイルの巨大な世界がある場合は、時間がかかる場合があります。ただし、エージェントが問題の解決方法について熟考するのにしばらく時間がかかることから、あまりにも外に見えないことがあります。

しかし、実際のハードコアソリューションを想像できます。パス検索グリッドに別の次元を追加します。したがって、2Dマップの場合、パスファインディンググリッドを3Dにします。この単純な例では、この新しい次元の深さは2のみですが、実際のゲームではすぐに大きくなります。

z = 0では、通常の状況で地形をマッピングします。つまり、水タイルは通行不可能と見なされます。

z = 1では、レーキがある間、地形をそのままマップします。つまり、水タイルは歩行可能と見なされます(ただし、たとえば壁タイルがある場合、固体のままである場合があります)。

パスファインディングは、x次元とy次元の通常のA *です。つまり、すべてのグリッドセルがその隣接セルにアクセスできると見なされます。ただし、z次元では、A *は拡散できません。

熊手があるところを除いて。レーキオブジェクトは、経路探索グリッドのz = 0とz = 1の間の開口部として機能します。

これは、A *がz = 0で外側に塗りつぶし、水に当たり、オプションがなくなることを意味します。次に、レーキタイルを介してz = 1に広がります(水が歩くことができる場合)。ゴールへの道を見つける。その効果は、ためらいのないNPCがレーキに移動し、次に最短経路をゴールに移動することです。


私の例では、レーキを「ウォーターウォーキングブーツ」のように扱っています。つまり、持っていればウォータータイルの上を移動できるオブジェクトを意味します。レーキを実際に地形の一部として「構築」する必要があり、水面を越えて到達するのに十分であるかどうかに関係なく、限られた量のタイルをカバーする場合、問題はさらに困難になります。ただし、私のソリューションでは使い捨てアイテムを許可していますが、z = 1で移動すると、自動的に再びz = 0にドロップダウンします。
Joar Jakobsson、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.