🌊

[UE4]ビヘイビアツリーを使って敵のアクションを切り替える

2022/04/21に公開

概要

執筆時バージョン UnrealEngine4.27

UE4のビヘイビアツリーという機能を使い、体力やプレイヤーとの距離でアクションが変化する敵キャラクターを実装していきたいと思います。

今回作成する敵のアクションは以下の通りです

  • プレイヤーとの距離が遠い場合ダッシュし、近い場合は歩いて近寄る
  • 体力が多い場合プレイヤーに向かっていき、少ない場合はと一定の座標へ向かう

ビヘイビアツリーとはキャラクターの思考や行動をツリー上に配置し、行動するまでの流れを視覚的に示したものです

ビヘイビアツリーの公式ドキュメントはこちらにあります
https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/ArtificialIntelligence/BehaviorTrees/BehaviorTreeUserGuide/

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
https://www.unrealengine.com/marketplace/en-US/product/bossy-enemy-animation-pack?sessionInvalidated=true

Discussion