みなさんこんにちは。
NakaRyoです。
今回はゲーム開発に必須機能であるCPUアクションについてお伝えします。
本記事では、AI Controller、Blackboard、Behavior Tree、AI Perception を連携させて、
ランダムに移動させていきます。
UEのAI/BehaviorTreeの基本
Unreal EngineのAI機能でよく使用されるのは以下の4つになります。
AI Controller
Pawn(キャラクター)に「思考」を与えるクラス。動作命令や判断ロジックを担当します。
ブループリントクラス⇒AIControllerで設定可能

Blackboard(ブラックボード)
AI が保持する変数ストレージ。「ターゲット位置」「攻撃状態」などを格納して、Behavior Tree に値を渡します。
AIメニュ⇒ブラックボード

Behavior Tree(ビヘイビアツリー)
NPC 行動のフロー制御ツール。ノード構造でタスク選択や条件判断を行います。
・主なタスク内容
Composite(Selector / Sequence)
Task(行動ノード)
Decorator(条件付き判断)
Service(定期処理)
AIメニュー⇒ビヘイビアツリー

AI Perception
視覚や聴覚による感知システム。感知結果を Blackboard に反映し、BT の動作条件に使うことができます。
たとえば一般的な挙動例として、以下のようなフローを設計できます
「プレイヤーを発見 → 追跡 → 攻撃/近づけなければ離脱 → 見失ったらパトロール再開」など。
AI Controller⇒コンポーネント追加⇒AI Perception(AI知覚コンポーネント)

実装準備
Behavior Treeの導入に入る前に、環境設定をおこなっていきます。
プロジェクト設定
プロジェクトはゲーム⇒サードパーソンを選択
プロジェクト設定は以下の通りに設定します。

プロジェクト画面を開いたら、
“ファイル⇒新規レベル⇒基本⇒作成”の順番でステージを作成します。


任意のフォルダにレベルを保存します。

AI Controller Blueprint の作成
Blueprintフォルダ上で
+追加⇒ブループリントクラス⇒AI Controllerを選択


名前を「BP_EnemyAIController」とします。

Blackboard の準備
1.BlackBoradの作成
新規フォルダを作成し、名前をAIとします。
フォルダ上から、「+追加」→「AI」→「Blackboard」を選択
名前を「BB_Enemy」とします。


BehaviorTreeの準備
先ほど作成したAIフォルダ上で、「+追加」→「AI」→「BehaviorTree」を選択
名前を「BT_Enemy」とします。


BT_Enemyを開いたら、Blackboard Asset
に先ほど作成した「BB_Enemy」を紐付けます。

NavMesh Bounds Volume の配置
BP_Enemyが実際に移動できるように、マップ上でナビメッシュを定義します。
レベルエディタ上で「+追加」→「ボリューム」→「Nav Mesh Bounds Volume」を選択し、
マップ全体をカバーするように配置します。



レベルエディタ上でPキー
もしくはメインメニュー「ビルド」→「Build Paths(ナビゲーション)」をクリックし、
緑色のメッシュが出ていればOKです。

AI 用キャラクター Blueprint の準備
1.新規キャラクター Blueprint を作成(例:BP_Enemy)
コンテンツフォルダに新たに”Blueprint”のフォルダを作成
作成したフォルダから右クリック⇒ブループリントクラスを選択

ブループリントクラス⇒キャラクターを選択

名前はわかりやすく「BP_Enemy」とします。
2.BP_Enemyの設定
Mesh編集
BP_Enemy を開き、コンポーネント⇒Meshを選択

Meshの詳細画面でSkeltalMeshAssetのアセット選択モードをクリックし、
デフォルトで入っているSKM_Manny_Simpleを選択します


こちらが初期状態になります。
CapsuleComponentの中にメッシュを入り込ませるのと、
ArrowComponentの矢印方向に合わせる編集をおこないます

Mesh⇒トランスフォーム
位置:0.0/0.0/-90
回転:0.0/0.0/-90
以下の通りになっていれば成功です。

CharacterMovement 編集
Componentsタブ内で CharacterMovement コンポーネントを選択。

詳細画面で移動速度を設定します。
Max Walk Speed:300

3.AI Controllerとの紐づけ
BP_Enemy の「詳細」パネルから、AI Controller Classを検索し、
先ほど作成したBP_EnemyAIControllerを指定します。

AI実装
ここからは、実際にAI機能を実装する手順に移行します。
AI Controller設定
敵キャラクターがゲーム開始時に自動でBehavior Treeを起動実装
先ほど作成したBP_EnemyAIControllerを開き、イベントグラフタブを選択します。
グラフ画面で以下ノードを設定します。
Event Begin Play⇒Run Behavior Tree⇒BTAssetをBT_Enemyに指定

コンパイルして保存します。
BehaviorTree(ビヘイビアツリー)の設定
ビヘイビアツリー側の設定をおこないます。
タスク設定
BT_Enemyを開き、新規タスク⇒BTTask_BlueprintBaseをクリックします。

保存する箇所とファイル名を記載します。
保存場所はAIフォルダへ、ファイル名をBTTask_Patrolにします。
保存します。

BTTask_Patrolのノード実装
BTTask_Patrolをクリックし、イベントグラフを開いたら、
以下の通りにノード設定を行います。
ノード設定手順
関数のオーバライドをクリックし、Event Receive Execute AIを選択

Event Receive Execute AIの実行ピンとAI Move Toの実行ピンを接続
Event Receive Execute AIのControlled PawnピンとAI Move ToのPawnピンを接続
Event Receive Execute AIのControlled PawnピンとGet Actor LocationのTargetピンを接続
Get Actor LocationのReturn ValueピンとGet Random Reachable Point in RadiusのOriginピンを接続
Get Random Reachable Point in RadiusのRadius値を300に設定
Get Random Reachable Point in RadiusのRandom LocationピンとAI Move ToのDestinationピンを接続

AI Move ToのOn SuccessピンとFinish Executeピンを接続
Finish ExecuteのSuccess欄にチェックを入れる

AI Move ToのOn FailピンとFinish Executeピンを接続
Finish ExecuteのSuccess欄はチェック無し(False状態)にする

コンパイルして保存します。
ビヘイビアツリー設定
BT_Enemyのツリー編集画面を開きます。
Root⇒Sequence⇒BTTask_Patrol(先ほど作成したタスク)⇒Wait(1.00s)
の順番に繋げていきます。

保存します。
動作確認
ここまでで、実装作業は終了です。
実際にCPUが動くかをチェックしていきます。
作成した新規レベルMAPを開きます。
BP_EnemyをPlayer Satat付近に配置し、シミレーションを押します。

以下の通りにCPUがランダムに移動していれば完成です。

まとめ
今回は、Unreal EngineのAI機能を使って、CPUのランダム歩行を実装しました。
CPU実装の基本編となりますので、参考になれば幸いです。
最後まで御覧いただきましてありがとうございました。