こんにちは!情熱開発部プログラム課の平野です。
いよいよ本格的に寒くなってきました今日この頃、皆様いかがお過ごしでしょうか?(私は無事、朝の布団から出られなくなりました。)
さて今回は、UE4でNPCのAIを実装する際によく使われる「ビヘイビアツリー」や「EQS」といった機能について、実際に簡単なNPC(名付けてロジカルビー子!)を作りながらご紹介させていただこうと思います。
※以下、UE4のVer.4.26を使用しております。
ビヘイビアツリーとは?
UE4の標準機能の一つで、AIの振る舞い(ビヘイビア)を作成する際に利用する機能です。 ツリー構造でキャラクターの思考を表現していて、行動に至るまでの流れが視覚的にわかりやすいという事が特徴です。
大原則として処理は左から右へ、上から下へ流れます。
使用するノードについて
コンポジットノード
【 Selectorノード 】
コンポジットノード(行動分岐用ノード)の一つです。
子ノードを左から順に評価し、成功したものがあるとその時点で処理を終了し、 Selectorノードは成功を返します。
全ての子ノードが失敗すると、Selectorノードは失敗を返します。
【 Sequenceノード 】
コンポジットノードの一つです。
子ノードを左から順に評価し、成功した場合は次の子ノードを実行します。
途中で子ノードが失敗するとその時点で処理を終了し、Sequenceノードは失敗を返します。
全ての子ノードが成功するとSequenceノードは成功を返します。
タスクノード
ツリー構造の葉にあたるノードで、キャラクターの行動を表しています。 ツリーの末端に位置し、子ノードを持てません。
処理が完了すると成功か失敗かを返し、これが前述の通りコンポジットノード(行動分岐)での重要なファクターになります。
移動や回転といった単純な行動であれば、UE4標準のタスクノードが存在しますが、もちろん独自にタスクノードを作成することも可能です。
デコレーターノード
条件式として機能し、アタッチされたノードを実行するかどうかの判定を行います。前述のコンポジットノードもしくはタスクノードにアタッチして使用します。
タスクノードと同様に、距離判定などのよく使う判定はUE4標準のものがありますが、独自の判定を実装することも可能です。
追いかけろ!ロジカルビー子!
それでは、実際にビヘイビアツリーを組んでみます。
試しに「離れている時はプレイヤーを追いかけ、近づくとプレイヤーの方向を向き続ける」という行動をさせます。下図のようにビヘイビアツリーを作成し、実行してみます。
※ピンクの方がロジカルビー子です。(ピンクですし、恐らく女の子でしょう。)
想定通り、ちゃんと追いかけてきました。
…でも単調すぎてちょっと可愛げがないですね。
近づいたら壁の裏に隠れるとかしてくれると、恥じらいが感じられて可愛いのですが…
それでは、「EQS」という機能を使ってそれを実現してみましょう!
EQS(Environment Query System)とは?
UE4の標準機能の一つで、 与えられた条件をもとに周りの環境を動的に探査し、最も適切な場所を求めてくれる機能です。
今回はプレイヤーとの間に遮蔽物がある最も近い地点を返すEQSを作成します。
Grid型のジェネレーターに、Distance(距離チェック)、Trace(遮蔽チェック)を追加することで簡単に実現できます。
このEQSを使って「プレイヤーに近寄られたら近くの遮蔽に隠れ、離れると近寄る、それ以外はプレイヤーの方を向く」というビヘイビアツリーを組んでみました。これで可愛くなるはずです。実行してみましょう!
慎ましき乙女!ロジカルビー子!
おお!ロジカルビー子が慎ましやかな女の子に成長してくれました!
これでプレイヤーもロジカルビー子に惹かれていく事でしょう!!
※EQSが最適な場所を探査する様子は、UE4のデバッグ機能(Gameplay Debugger)でリアルタイムに確認することができます。
最後に
いかがでしょうか。AIというと取っ付き難いイメージがあるかと思いますが、このようにノードベースで手軽にAIを実装できる機能が、UE4には搭載されています。また独自の処理を組み込むことも容易なので、無限の拡張性が秘められています。今後も積極的に利用していきたいですね。
もしUE4でAIを実装する機会がございましたら、ロジカルビー子の事を思い出していただけますと幸いです。
最後までご清覧いただきまして、ありがとうございました。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。