あいさつ
みなさんこんにちは!情熱開発部の金澤です!
5月も終わりに近づき、だんだんと暑さが増してきましたね。この季節になると、外出時には日陰や裏道などの快適なルートを選びたくなります。
というわけで今回はUE4でAIの通るルートを制御して思い通りのルートを通らせてみようと思います。
使うバージョンはUE4.27になります。
使うもの
さてどうやってAIの通り道を制御するかというと、今回は以下の二つを使用します。
NavModifierVolume
SupportedAgents
NavModifierVolumeはレベル上に配置できるボリュームになります。
これはAreaClassを設定することによってその範囲のナビゲーション優先度を下げたり、障害物のように通れなく出来ます。
このAreaClassはデフォルトで用意されているものの他に自分で作成して設定することもできます。
SupportedAgentsはプロジェクト設定から追加できるAIごとに使用するナビメッシュを設定出来るものです。
これはナビメッシュの種類のようなもので、どのようなAIがそのナビメッシュを使用できるかを設定できます。
動作確認
では早速使って動きを見てみましょう。
今回はサードパーソンのテンプレートを改造していきます。
まずはナビメッシュを敷きましょう。
ナビメッシュはレベルにNavMeshBoundsVolumeを置くことで敷くことができます。
そこから一度ビルドをしてちゃんと出来ているか見てみましょう。
ナビメッシュはPキーを押すことで可視化できます。
すると全体的に緑色のものが出てきましたね、これがナビメッシュの適用範囲になります。
ナビメッシュが用意出来たら次は簡単なAIを用意します。
プレイヤーを追いかけるキャラクターを作成しますが、AIキャラクター作成について詳しくは弊社ブログである以下二つの記事を参考にしてみてください。
というわけでプレイヤーを追いかけてくるキャラクターが出来ました。
ロジ男くんです。
NavModifierVolume
ではまずNavModifierVolumeから置いてみましょう。
アクタを配置からNavModifierVolumeを探して置いてみます。
すると置いた場所のナビメッシュが消えましたね、これはこのボリュームのAreaClassの設定が「NavArea_NUll」になっているためになります。
なのでAreaClassを「NavArea_Obstacle」に変更してみましょう。
今度はエリアが赤くなりましたね!
これは通常は通ることのできない高コストなエリアとして扱われます。なので試しに歩いてみると、確かにAIは避けるように動きます。
ただ「通常は避けるエリア」なのでそれ以外に通り道が無い場合は通ることもできます。
次に独自のAreaClassを作成してみます。
新規作成→ブループリントからNavAreaを親にして作り、BP_NavArea_HighとBP_NavArea_Lowを作りましょう。
そしてDefaultCostとColorをそれぞれ変更します。
DefaultCostはそこを通るために必要なコストでありColorはナビメッシュ状に置いた時の色になります。
そのためコストの高いエリアと低めのエリアを並べておくと
このように低いエリアを選んで進むようになります。
SupportedAgents
次はSupportedAgentsを設定してみましょう。
SupportedAgentsはプロジェクト設定→エンジン→ナビゲーションシステム→エージェントにあります。
サポートされているエージェントを追加すると様々な設定項目があります。
では+を押して二つ作ってみることにしましょう。
ここで主に設定するのは
Name
Color
NavAgentRadius
NavAgentHeight
になります。
Nameはその通りSupportedAgentsの名前になります。ここでは「Default」と「BigNavi」という名前にします。
Colorはナビメッシュの適用範囲として表示される場合の色になります。デフォルトが緑のためもう片方は青色にします。
で、ここからが大事なのですが
NavAgentRadiusやNavAgentHeihgtなどはAIがナビメッシュとして使用するかの判断に使用する値になっており、
AIは自分のサイズ以上のNavAgentHeihgtやNavAgentRadiusであれば使用できます。
例えば、今回はAIキャラクターのサイズが42のためデフォルトの32だと適用外ということになります。
そのため「Default」は42、「BigNavi」は100くらいに設定してみます。
さて、SupportedAgentsの設定が終わったら実際に適用をしてみましょう。
ですがその前に比較用としてもう一人AIキャラクターを追加します。
ロジ男くんを複製して作成しCapsuleRadiusをこっちは60まで大きくしてみます。
というわけで出来ました。ビー太くんです。
ビー太くんもフィールドに配置したらナビメッシュの設定に戻ります。
フィールドに設置したNavMeshBoundsVolumeの詳細からナビゲーションタブにSupportedAgentsという項目があります。
そこには今回追加した「Default」と「BigNavi」の項目が増えているかと思うのでまずはDefaultのみチェックが付いた状態でビルド実行してみましょう。
するとロジ男くんだけが動き、ビー太くんは動かないと思います。
これは先ほど説明したように、ビー太くんのRadiusサイズが60に対してDefaultのNavAgentRadiusが42であるためAIがそのナビメッシュを使用しないようになります。
では今度はBigNaviのみにチェックを入れてまた実行してみましょう。
すると今度はビー太くんのみが動き出したと思います。
これはBigNaviのNavAgentRadiusが大きいため、ロジ男くんはよりサイズの近いDefaultのナビメッシュを使用するようにAIが判断し、サイズの大きいビー太くんのみがBigNaviのほうを使用する判断をしているためになります。
ですがNavAgentRadiusが大きいということはその分適用範囲も限られてきます。
このように細めの通路があった場合、Defaultのナビメッシュは間を通れますが、BigNaviのナビメッシュの場合間を通ることができません。
そのためDefault、BigNaviどちらもチェックを入れた状態で通路に入ってみると
このようにロジ男くんだけが着いてきてビー太くんは迂回してきます。
ルート制御
ではこれらの特性を考慮してAIが通るルートの制御してみましょう。
というわけで迷路を作ってみました。
一見すると迷路のように見えないかもしれませんがナビメッシュを表示してみると
はい、このように見えない通行制限がたくさんあります。
NavModifierVolumeによる優先度設定や
道幅を細くしてSupportedAgentsの適用範囲をずらしたりしております。
そのため同じ位置からロジ男くんとビー太くんをスタートさせてもそれぞれが違うルートを辿ってゴールであるビー子ちゃんのもとへ行ってくれるはずです。
では思い通りに動くのか見てみましょう。
良いですね!思った通りにロジ男くんは細い道を選んで進み、ビー太くんはそれを避けるように進んでいます。
他にもNavModifierVolumeで設定した優先度に従って道を選んでいることもわかりましたね!
結果を受けて
実験の結果SupportedAgentsやNavModifierVolumeを使ってAIの移動するルートをある程度コントロールすることが出来ました。
今回は迷路に配置するという形で使用しましたが、他にも
SupportedAgentsを使用して車道と歩道を分けたり、NavModifierVolumeをComponentにしたNavModifierComponentをアクターに追加することで障害物用のアクターとして活用することもできます。
細かい制御はともかく、大まかなルート制御であればこういった機能を使うと作業が楽にできますね。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。