複数のビヘイビアツリーを作り、近距離タイプと遠距離タイプの敵を分ける。
VRゲーム用にAIのやり直し。先は長いけど繰り返し学習して身につく。#UE5 #アンリアルエンジン pic.twitter.com/vyfxjwjN50
— ハマーキーUE (@Hummerkey_UE) October 22, 2023
敵AIの第4回になります。過去記事で作成したものが必須になります。
敵AI:敵がルートを巡回しプレイヤーや音に気付くと反応
敵AI 2:敵が間合いを取りながら攻撃してくる
敵AI 3:敵が逃げて隠れて再び攻撃してくる
記事は自分でやり直す時のために簡単にまとめているものですから、学習するなら参考元の
Ali Elzoheiry氏のSmart Enemy AI Tutorial Seriesの動画を視聴してください。
BP_EnemyBaseの子ブループリント クラス
子ブループリント クラスを作成
名前: BP_EnemyRanged
エネミーのベースであるBP_EnemyBaseで右クリックして「子ブループリント クラスを作成します」を選択。名前はBP_EnemyRanged。
名前: BP_EnemyMelee
同じように「子ブループリント クラスを作成します」で名前はBP_EnemyMelee。
アニメーションブループリントを複製して名前変更
BP_EnemyBaseで使用しているアニメーションブループリントを複製し、名前をABP_EnemyRangedなどに変えておきます。
それをBP_EnemyRangedにセットする。
アニメーションを用意する
遠距離タイプの敵ですから、銃、弓矢、魔法などが考えられます。
Idleのアニメーションシーケンス、
Walk&Runのブレンドスペース、
武器装備のON/OFFのAnimMontage、
攻撃のAnimMontageが必要です。
Lyra Starter Game
銃のアニメーションやサウンドはLyra Starter Gameで入手できます。
Lyra Starter Game:UE ゲームサンプル – UE マーケットプレイス
銃の音はAudio > Sounds > Weaponにあります。
右クリックしてアセットアクション > エクスポートで.WAVファイルとして取り出せます。
銃のアニメーションはCharacters > Heroes > Mannequin > AnimationsのActionsとLocomotionにあります。
こちらも右クリックしてアセットアクション > エクスポートで.FBXファイルとして取り出せます。
武器装備と攻撃のAnimMontage
EnemyBaseの時と同じやり方です。
アニメーションシーンケンスからAnimMontageを作成。
通知を追加 > MontageNotifyで武器装備時や発射時の通知をします。
武器装備ON/OFFのMontageNotifyの名前は以前に設定した武器と同じです。
通知を追加 >PlaySoundで発射音もセットすると良いでしょう。
通知を追加 >PlayPerticleEffectでマズルフラッシュなどのエフェクトを追加できます。
エフェクトはSocket名を指定して、そこを基準にLocation Offsetで位置調整ができます。
敵のスケルトン
弓や銃を持つ場合、スケルトンにSocketを追加する必要があります。
アニメーションブループリント: ABP_Enemy_Ranged
AnimGraph
Locomotion > Idleに遠距離武器用のアニメーションシーケンスをセットする。
Locomotion > Walk/Runに遠距離武器用のブレンドスペースをセットする。
BP_WeaponBase
複数の武器を管理するようになりますから、武器のベースとなるブループリントを作成します。
以前作成して既にBP_EnamyBaseのイベントグラフにもセットしてあるBP_AxeをBP_WeaponBaseに名前変更しました。
このブループリントはStaticMeshがセットされていますが、SkeletalMeshも追加しました。
このBaseではStaticMeshもSkeletalMeshも空でいいです。
コリジョンは必ずNoCollision。
BP_WeaponBaseの子ブループリント クラス
近距離武器
武器のベースであるBP_WeaponBaseで右クリックして「子ブループリント クラスを作成します」を選択。名前はBP_Weapon_Axe。
StaticMeshかSkeletalMeshにAxe(斧)のメッシュをセットする。
遠距離武器
同じように子ブループリント クラスを作成し、名前はBP_Weapon_Pistol。
StaticMeshかSkeletalMeshにピストルのメッシュをセットする。
ビヘイビアツリー
複数のビヘイビアツリーを管理するのでBehaviorTreesというフォルダを作ったほうが良いです。
ビヘイビアツリーの整理をしますが、敵が逃げて隠れるFindCover(Sequence)は今は繋ぎませんが後で使いますので、削除せずに置いておいてください。
BT_SubTree_Investigating
名前: BT_SubTree_Investigating
新規作成。
BT_EnemyBase側では削除して、IvestigatingState(Sequence)をRun Behaviorに置き換え、詳細のBehavior AssetにBT_SubTree_Investigatingをセットする。

BT_SubTree_Passive
名前: BT_SubTree_Passive
新規作成。
BT_EnemyBase側では削除して、Run Behaviorに置き換え、詳細のBehavior AssetにBT_SubTree_Passiveをセットする。
2つのRun Behaviorは名前変更しています。

BT_EnemyMelee
BT_EnemyBaseを複製して名前変更。
BT_EnemyBase
BT_EnemyMeleeを作成後、再びBT_EnemyBaseを編集します。
この状態でBT_EnemyRangedを作成できます。
BT_EnemyRanged
BT_EnemyBaseを複製して名前変更。
敵BP: BP_EnemyBase
変数の追加
BehaviorTree – ビヘイビアツリー(Behavior Tree)
※デフォルト値はBT_EnemyBase
敵BP: BP_EnemyRanged
イベントグラフ
戦闘態勢のON/OFFはBaseとは別にします。
Baseの戦闘態勢のON/OFFをそのままコピペする。

クラスからアクタをスポーンしますのClassに遠距離攻撃武器を設定。
Attach Actor To ComponentのSocket Nameに武器をアタッチするソケット名を入力。
デフォルト値
BehaviorTreeに、
BT_EnemyRangeをセットします。
遠距離から攻撃しますので、
AttackRadiusを600
DefendRadiuaを600
敵BP: BP_EnemyMelee
イベントグラフ
戦闘態勢のON/OFFはBaseとは別にします。
Baseの戦闘態勢のON/OFFをそのままコピペする。

モンタージュを再生しますに近距離攻撃用のAnimMontageを指定。
クラスからアクタをスポーンしますのClassに近距離攻撃武器を設定。
Attach Actor To ComponentのSocket Nameに武器をアタッチするソケット名を入力。
デフォルト値
BehaviorTreeに、
BT_EnemyMeleeをセットします。
AIコントローラー: AIC_EnemyBase
環境クエリ: EQS_FindIdealRangeLocation
名前: EQS_FindIdealRangeLocation
デコレーター: BTD_CanSeeTarget
敵がプレイヤーを見ているかどうかを確認するためのデコレーター。
親クラス: BTDecorator_BlueprintBase
名前: BTD_CanSeeTarget
新規作成。
ビヘイビアツリー: BT_EnemyRanged
EvadeAndAttack(Sequence)
BTD_CanSeeTargetのオブザーバーを中止はBoth、Attack Target KeyはAttackTarget。ターゲットが見えている場合のみ、以下のSequenceを実行します。
BTTask_FocusTargetのAttack Target KeyはAttackTarget。
BTTask_SetMovementSpeedのSpeedはJogging。
Run EQS QueryのQuery TemplateはEQS_FindIdealRangeLocation、Run ModeはSingle Random Item from Best 25%、BBKeyはAttackRadius、Blackboard KeyはPointOfInterest。
Move ToのBlackboard KeyはPointOfInterest。
WaitのWait Timeは0.3、Random Deviationは0.1。
MoveToLineOfSight(Sequence)
BTTask_SetMovementSpeedのSpeedはSprinting。
Run EQS QueryのQuery TemplateはEQS_FindIdealRangeLocation、Run ModeはSingle Best Item、BBKeyはAttackRadius、Blackboard KeyはPointOfInterest。
Move ToのBlackboard KeyはPointOfInterest。
遠距離タイプの敵の攻撃AnimMontage
攻撃用のAnimMontageの発砲のタイミングに合わせてMontage Notifyを追加し、名前をFireにしています。
このMontage NotifyをBP_EnemyBaseのイベントグラフで受け取り、発砲イベントに繋がるわけです。
敵BP: BP_EnemyBase
イベントグラフ
ダメージシステムの追加
汎用性と拡張性の高いダメージシステム
デコレーター: BTD_IsHealthBelowThreshold
親クラス: BTDecorator_BlueprintBase
名前: BTD_IsHealthBelowThreshold
新規作成。

【変数】HealthThreshold – Float
新規作成。目玉アイコンを開ける。スライダ範囲と値の範囲をそれぞれ0~1にする。デフォルト値は0.3にします。Healthが3割以下になったら、このデコレーター以下のSequenceが実行されます。
目玉アイコンを開けていますからビヘイビアツリー上でも変更可能です。
タスク: BTTask_Heal
敵が回復するタスクです。
名前: BTTask_Heal
新規作成。
ビヘイビアツリー: BT_EnemyRanged
敵AI 3:敵が逃げて隠れて再び攻撃してくるで作成したFindCoverをコピペして使います。
FindCover(Sequence)
BTD_IsHealthBelowThresholdのオブザーバーを中止はBoth。
BTTask_FocusTargetのAttack Target KeyはAttackTarget。
コメント