Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 AIがナビメッシュを使わずに移動する際のTips

AIが移動を行う際には、MoveToなどのノードや関数を使って移動することが多いとはずです。

そしてMoveToなどを使う際には必ずといっていいほどにナビゲーションメッシュを使うことになりますが、実はナビゲーションメッシュがなくても移動自体は可能です。以下の記事を読んでいただくと簡単に移動系ノードについてを理解できると思います。

unrealengine.hatenablog.com

ナビメッシュありなしのメリット、デメリット

ナビメッシュがあった時となかった時のそれぞれのメリット・デメリットをあげてみましょう。

ナビメッシュのメリット
・経路探索により、最小移動量による目的地を探すことができる
・ナビメッシュによる移動可能・不可能エリアが設定できる
・RecastNavMeshからナビメッシュの様々な情報を設定・取得ができる

ナビメッシュのデメリット
・縦方向の移動には対応しない
・ナビメッシュを必ず生成しなくてはならない
・状況が変化するとナビメッシュを動的に更新しないといけない

主にこういった点で利点と問題があります。ほとんどの点ではナビメッシュがあった方が有利なのは明確ですが、特に縦方向の移動や壁に張り付いて移動するAIが必要になった際にはこのままでは厳しいと言えます。

ではナビメッシュなしで移動すること自体はけして難しくないのですが、色々と罠がありますのでその点についてを解説します。

Actor指定とLocation指定

まず理解しないといけないのは、ナビメッシュありでもなしでも移動する際、ゴール地点に指定するのがActor指定とLocation指定の2種類があります。

f:id:alwei:20200627223210p:plain

例えばこの"Move To Location or Actor"は"Goal Location"と"Goal Actor"を指定するのでは全く意味が変わってきます。前者は一度きりの座標を参照して終わりですが、後者は座標が更新され続けるので、移動位置も常に更新される分、負荷も多少上がることになります。

ちなみに両方を一緒に指定すると、優先されるのは"Goal Actor"の方で、"Goal Location"の指定は無視されるようです。

ここでナビメッシュなしで移動したい場合には、ノード下部の▼印をクリックして詳細を開き、"Use Pathfinding"のチェックを外すとOKです。"Goal Actor"指定の場合はこれだけでナビメッシュなしでの移動が可能となります。しかし、"Goal Location"指定の場合にはもうひとつの設定が必要です。

f:id:alwei:20200627230013p:plain

"Use Pathfinding"のチェックを外すことと、"Project Goal on Navigation"の指定を必ず"No"にしておく必要があります。これでゴールの指定にナビメッシュを用いることがなくなります。

f:id:alwei:20200627225459p:plain

同種の移動ノードとして、"Move to Location"と"Move to Actor"がありますが、前者のみに"Project Destination to Navigation"という設定が存在し、デフォルトでオフに設定されていることから、Location指定をする際には必須の設定なのでしょう。

これら以外の移動ノード、"AI MoveTo"、"Simple Move to Actor"、"Simple Move to Location"には"Use Pathfinding"がないので、ナビメッシュなしでの移動が不可能ということになります。

ビヘイビアツリータスク

ビヘイビアツリー上でもタスクノードを使うことで移動することが可能です。ただし、最もよく使うであろう"Move To"タスクノードは標準で"Use Pathfinding"モードを使って移動するようになっているためナビメッシュが必須となっておりますが、"MoveDirectlyToward"はナビメッシュなしの移動が可能です。

f:id:alwei:20200627230706p:plain

こちらでも"Project Goal Location"のチェックを外すことで、Location指定が可能です。Actor指定の場合は特に必要ありません。非常に簡単です。

実際の動作

あとはCharactorMovementやPawnMovementコンポーネントを持ってさえいればどのようなアクターでも移動が簡単に可能です。

このように空中を移動するようなAIや、壁に張り付いて移動するようなAIでも移動先さえ正しく指定すれば動作します。壁に張り付く場合は移動面の向きを取得するなどの工夫が必要です。

ただし、ナビメッシュを使わない場合、当たり前ですが直線的な移動のみとなり、障害物などを考慮することができません。これを理解した上で正しい移動先を指定させてあげることが重要です。