[UE4]ビヘイビアツリーを使って敵のアクションを切り替える
概要
執筆時バージョン UnrealEngine4.27
UE4のビヘイビアツリーという機能を使い、体力やプレイヤーとの距離でアクションが変化する敵キャラクターを実装していきたいと思います。
今回作成する敵のアクションは以下の通りです
- プレイヤーとの距離が遠い場合ダッシュし、近い場合は歩いて近寄る
- 体力が多い場合プレイヤーに向かっていき、少ない場合はと一定の座標へ向かう
ビヘイビアツリーとはキャラクターの思考や行動をツリー上に配置し、行動するまでの流れを視覚的に示したものです
ビヘイビアツリーの公式ドキュメントはこちらにあります
1. 準備
事前準備物として以下のものを用意します
- フォルダ
- 敵のキャラクター
- 敵のアニメーション設定
- 変数宣言
フォルダの作成
Content直下に敵用のコンテンツをまとめるフォルダを作成します
フォルダ名をEnemyBPとします
EnemyBPフォルダ内にAI機能を格納するフォルダとしてEnemyAIフォルダを作成します
敵キャラクターの作成
敵キャラクターを作成するためThirdPersoncharacterより複製します
複製したBPの名前をEnemyに変更し、EnemyBPフォルダへ移動させます
キャラクターのメッシュ,アニメーション設定
敵とプレイヤーで違いを分かりやすくするため、キャラクターのメッシュとアニメーションを変更します
EnemyBPを開きます
メッシュの変更が完了しました
続いてアニメーションブループリントを設定します
敵キャラクターにアニメーションブループリントが設定されました
ブループリントイベントの作成
敵キャラクターの体力を減らすためのスクリプトをThirdPersonCharacter、EnemyAIの二つで作成します
変数の作成
体力用の変数としてEnemyにFloat型の変数Healthを作成します
作成後はデフォルトの値を100に設定します
イベント作成
ThirdPersonCharacterに記述したブループリントは以下の通りです
EnemyAIに記述したBPについても以下の通り
2. AI機能の作成
AIControllerの作成
ビヘイビアツリーの起動用に用いるAIControllerを作成します
ブループリントクラスをクリックしAIControllerを選択してください
名前をEnemyAI_Controllerに設定します
EnemyAI_Controlerを開き、BeginPlayよりRunBehaviorTreeノードを接続します
BTAssetにEnemyAI_BehaviorTreeを設定します
ブラックボードの作成
BehaviorTreeの記憶域としてBlackboardを作成します
名前をEnemyAI_Blackboardに設定します
敵キャラクターの行動を変化させるために必要な変数をBlackboardに追加します
必要な変数としては以下のようになります
PlayerActor
変数の型は Actor Playerの情報をAIが取得するために使用します
MyHealth
変数の型は Float AIの体力を確認し、動作を分岐させるために使用します
Distance
変数の型は Float AIとプレイヤーの距離を確認し、動作を分岐させるために使用します
EvacPosition
変数の型はVector 退避する場所を指定します
これでブラックボードの変数キー追加が完了しました
これにより、これらの変数をビヘイビアツリーから参照できます
ビヘイビアツリーの作成
AIにアクションを起こさせるためにビヘイビアツリーを作成します
右クリックしAIの欄を選択しビヘイビアツリーをクリックします
名前をEnemyAI_BehaviorTreeに設定します
今回のBehaviorTreeは以下のように作成しました
体力が多い時はプレイヤーを追い、体力が少ない時は退避地点へ逃げるAIを作成しました
体力を確認し、処理を分岐させる箇所です。
Health&Distance Checkのセレクターにて体力が多い場合左へ、少ない場合右へ動作させるような処理を行っています
サービスを作成
体力と距離によりアクションを変化させるため、サービスを作成します
名前はManagerとします
全体像はこのようになります
はじめにEnemyをキャストし変数として格納した後
PlayerActorとEvacLocationの値をそれぞれのBlackboardのキーに取得しています
こちらは主にサービスの判定に使用する箇所です
プレイヤーとAIとの距離を確認するためにGetDistanceを使用し距離の差分をBlackBoard変数Distanceに取得します
また、EnemyよりHealthをBlackBoard変数MyHealthに取得します
この処理を行うことでビヘイビアツリーにおける分岐処理が可能になります
サービスの結果によってプレイヤーを追うか、プレイヤーから退避するか、
どちらかのアクションを起こします
プレイヤーを追う場合
体力が50以上ある場合、AIはプレイヤーを追いかけてきます
プレイヤーとの距離で処理を分岐させ、遠い場合は走るように、
近くまで来た際は歩きで近づき、攻撃アニメーションを再生する処理を作成しました
こちらの分岐処理そのものはManagerにて実施しています
タスクを作成
走りと歩きの速度を変化させるタスクとしてChaseSpeedタスクを作成します
MaxWalkSpeedというFloat型の変数を作成します
これによりSpeedタスクごとにスピードの設定が可能になります。
デフォルトのタスクMovetoにPlayerActorをセットすることで敵AIはプレイヤーを追跡するようになります
距離が遠い場合
敵キャラクターの速度が600になり、走ってプレイヤーに近づくようになります
距離が近い場合
敵キャラクターの速度が200になり、ゆっくりプレイヤーへ近づいたのち、攻撃アニメーションを再生します
プレイヤーから逃げる場合
体力が50以下の場合、
タスクMovetoにEvacLocationを設定し、その位置へ移動するようにします
ナビゲーションメッシュの設置
レベル上でAIを動かすためにナビゲーションメッシュをレベルへ設置します
3. 完成
完成しました!
今回はビヘイビアツリーのシステムの紹介としてこのAIを作成しました。
今回作成したもの以外にも更に細かい仕様を作りこむことが出来ますので是非参考にしてください。
4. 今回使用したアセット一覧
*Bossy Enemy Animation Pack
Discussion