敵AI 10:中ボスクラスの魔術師

テレポート、ファイアボール、回復を使う魔術師の敵。


Ali Elzoheiry氏のチュートリアルから学ぶ敵AIの第10回になります。過去記事で作成したものが必須になります。
敵AI:敵がルートを巡回しプレイヤーや音に気付くと反応
敵AI 2:敵が間合いを取りながら攻撃してくる
敵AI 3:敵が逃げて隠れて再び攻撃してくる
敵AI 4:近距離タイプと遠距離タイプの敵を分ける
汎用性と拡張性の高いダメージシステム
プロジェクタイル(Projectile)の基本
敵AI 5:敵の攻撃とブロック
敵AI 6:プレイヤーを見失った敵が捜索を始める
敵AI 7:NavLinkProxyで敵にジャンプさせる 
敵AI 8:集団の敵の攻撃タイミングの管理
敵AI 9:AIが敵と味方を区別して戦うようになるチームバトル
AOE(Area of Effect)

記事は自分でやり直す時のために簡単にまとめており、独自の仕様にもなっていますから、学習するなら参考元のAli Elzoheiry氏のSmart Enemy AI Tutorial Seriesの動画を視聴してください。
Smart Enemy AI | (Part 13: Mage Enemy) | Tutorial in Unreal Engine 5 (UE5) | Youtube

必要なもの

ビヘイビアツリー: BT_EnemyMage

BT_EnemyRangedを複製してBT_EnemyMageにします。

アニメーションBP: ABP_EnemyMage

BP_EnemyBaseで使用しているアニメーションブループリントを複製し、名前をABP_EnemyMageにします。

必要に応じてロコモーションを置き換える。
魔術師用のロコモーションにするならブレンドスペースを作成する必要があります。
その場合、アニメーションシーケンスのEnableRootMotionとForce Root Lockにチェックを入れましょう。

魔法弾のAnimMontage

※AOEで魔法弾を作っている時に作成済です。名前がFireball_Montageでした。
予備動作が長いのでカットします。
Start Timeを0.7にする。

未作成ならアニメーションシーケンスからAnimMontageを作成。

魔法を撃つタイミングに通知を追加 > Montage Notify。名前をMagicballにします。

メイジBP: BP_EnemyMage

BP_EnemyBaseから「子ブループリント クラスを作成」する。
名前はBP_EnemyMage。

Animation > Anim ClassにABP_EnemyMageを設定。

インターフェース: SetMovementSpeed

Idle0、Walking150、Jogging250、Sprinting400。
※変数化している場合は変数のデフォルト値に入力。

インターフェース: GetIdealRange

Attack Radius500。攻撃距離です。
Defend Radius700。間合いです。
※変数化している場合は変数のデフォルト値に入力。

その他のデフォルト値

Behavior Tree
Hit Reaction Montage
Block Montage

イベントグラフ
ノードを組む Combat Stance
・BP_EnemyBaseから戦闘態勢のON/OFFをコピペしてから編集。

・武器は持たないので武器関連のノードは消す。
・戦闘態勢ON/OFFのAnimMontageはセットする必要があります。構えているIdleアニメーションシーケンスからAnimMontageを作成すれば良いでしょう。
戦闘態勢を解除した時は、棒立ちのAnimMontageにする。AnimMontageが長すぎる場合はEnd Timeで調整。
ノードを組む EnemyAttack
・BP_EnemyBaseと共用はせず、BP_EnemyMageのイベントグラフにイベント Enemy Attackを配置します。
BP_EnemyBaseとの共用も可能ですが、共用しないパターンもやりたいだけです。
・BPC_AttacksでMagicBallを作成済なのが前提です。
ノードを組む Teleport


【変数】
IsTeleporting? – Boolean
└新規作成。
TeleportBodyEffect – Cascade Particle System
Spawn Emitter AttachedReturn Valueから変数へ昇格
TeleportTrailEffect – Cascade Particle System
Spawn Emitter AttachedReturn Valueから変数へ昇格
【イベントディスパッチャー】OnTeleportEnd
・AI Move ToのAcceptance Radius(受入半径)を15にしていますが、15だとたまに受け入れてもらえず動作が遅れる場合もあります。50くらいした方が安定します。
・最後のTeleportEndはカスタムイベントを作成してから繋げる。
ノードを組む TeleportEnd

タスク: BTTask_Mage_Teleport

基底クラス: BTTask_BlueprintBase
名前: BTTask_Mage_Teleport
新規作成。
ノードを組む

【変数】
TeleportLocation – Blackboard Key Selector
└新規作成。目玉アイコンを開ける。

タスク: BTTask_MageAttack

基底クラス: BTTask_BlueprintBase
名前: BTTask_MageAttack
BTTask_RangedAttackを複製して名前変更。
ノードを組む
・BTTask_RangedAttackを複製した場合はSet Focusの後ろからを編集。

【変数】
AttackTargetKey – Blackboard Key Selector
└新規作成。目玉アイコンを開ける。※BTTask_RangedAttackを複製した場合は既にあります
TokensNeeded – Integer
└作成。目玉アイコンを開ける。※BTTask_RangedAttackを複製した場合は既にあります
TeleportLocation – Blackboard Key Selector
└新規作成。目玉アイコンを開ける。

環境クエリ: EQS_Teleport

EQS_Seekingを複製してEQS_Teleportにする。

環境クエリの編集

PathCostのTest ModeをPath Existにする。
TraceのTrace SphereをSphere、Extent Xを40、ブールー一致のチェックを外す。
Distanceを追加。Distance ToをEQS_Context_AttackTarget、Float Value Minを350、Float Value Maxを500にする。
Float Value MaxのData BindingをQuery Paramsにして、Param NameをAttackRadiusにする。
Distanceを追加。Test PurposeをScore Only。

ビヘイビアツリー: BT_EnemyMage

ビヘイビアツリーの編集

■Attack(Sequence)
Run EQS QueryのQuery TemplateをEQS_Teleport、BBKeyをAttackRadius、Blackboaed KeyをPointOfInterest。
BTTask_MageAttackのAttack Target KeyをAttackTarget、Tokens Needeを1、TeleportLocationをPointOfInterest。
BTTask_Mage_TeleportのTeleport LocationをPointOfInterest。
■Evade(Sequence)
BTTask_SetMovementSpeedのSpeedをSprinting。
Run EQS QueryのBBKeyをDefendRadius。
■MoveToLineOfSight(Sequence)
Run EQS QueryのBBKeyをDefendRadius。

回復

回復魔法のAnimMontage

回復魔法のアニメーションシーケンスからAnimMontageを作成
Start Timeを1.6
End Timeを2.0
にする。

アセットブラウザから回復魔法のアニメーションシーケンスをAnimMontageのタイムラインにドロップして追加する。

追加したアニメーションシーケンスの
Start Timeを2.0
End Timeを2.3
Play Rateを0.1
にする。

メイジBP: BP_EnemyMage

ノードを組む

【変数】
HealAOE – BP_AOE_Heal
クラスからアクタをスポーンしますReturn Valueから変数へ昇格
【イベントディスパッチャー】
OnHealOverTimeEnd

タスク: BTTask_Mage_Heal

基底クラス: BTTask_BlueprintBase
名前: BTTask_Mage_Heal
新規作成。
ノードを組む

ビヘイビアツリー: BT_EnemyMage

ビヘイビアツリーを編集

■FindCover(Sequence) → Heal(Sequence)
・最初にFindCover(Sequence)より下を全削除し、名前をHeal(Sequence)に変更。

BTD_IsHealthBelowThesholdのオブザーバーを中止はNone。
■Attack(Selector)
BTD_CanSeeTargetのオブザーバーを中止はBoth。
・右側のRun EQS QueryのBlackboard KeyはPointOfInterest、BBKeyはAttackRadius。

コメント

タイトルとURLをコピーしました