敵AI 4:近距離タイプと遠距離タイプの敵を分ける

複数のビヘイビアツリーを作り、近距離タイプと遠距離タイプの敵を分ける。


敵AIの第4回になります。過去記事で作成したものが必須になります。
敵AI:敵がルートを巡回しプレイヤーや音に気付くと反応
敵AI 2:敵が間合いを取りながら攻撃してくる
敵AI 3:敵が逃げて隠れて再び攻撃してくる

記事は自分でやり直す時のために簡単にまとめているものですから、学習するなら参考元の
Ali Elzoheiry氏のSmart Enemy AI Tutorial Seriesの動画を視聴してください。

BP_EnemyBaseの子ブループリント クラス

子ブループリント クラスを作成
親: BP_EnemyBase
名前: BP_EnemyRanged

エネミーのベースであるBP_EnemyBaseで右クリックして「子ブループリント クラスを作成します」を選択。名前はBP_EnemyRanged。

親: BP_EnemyBase
名前: 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

BP: AI > ビヘイビアツリー
名前: BT_SubTree_Investigating
新規作成。
ビヘイビアツリーを組む

BT_EnemyBaseにあるIvestigatingState(Sequence)から下をコピペするだけです。
※BT_EnemyBase
BT_EnemyBase側では削除して、IvestigatingState(Sequence)Run Behaviorに置き換え、詳細のBehavior AssetにBT_SubTree_Investigatingをセットする。

BT_SubTree_Passive

BP: AI > ビヘイビアツリー
名前: BT_SubTree_Passive
新規作成。
ビヘイビアツリーを組む

これもBT_EnemyBaseにある右下の部分をコピペするだけです。
※BT_EnemyBase
BT_EnemyBase側では削除して、Run Behaviorに置き換え、詳細のBehavior AssetにBT_SubTree_Passiveをセットする。
2つのRun Behaviorは名前変更しています。
この状態でBT_EnemyMeleeを作成できます。

BT_EnemyMelee

名前: BT_EnemyMelee
BT_EnemyBaseを複製して名前変更。

BT_EnemyBase

BT_EnemyMeleeを作成後、再びBT_EnemyBaseを編集します。

ビヘイビアツリーを組む

・左はBTTask_CombatStanceまで残します。

この状態でBT_EnemyRangedを作成できます。

BT_EnemyRanged

名前: BT_EnemyRanged
BT_EnemyBaseを複製して名前変更。

敵BP: BP_EnemyBase

変数の追加

BehaviorTree – ビヘイビアツリー(Behavior Tree)
※デフォルト値はBT_EnemyBase

敵BP: BP_EnemyRanged

イベントグラフ
ノードを組む
戦闘態勢のON/OFFはBaseとは別にします。
Baseの戦闘態勢のON/OFFをそのままコピペする。
モンタージュを再生しますに遠距離攻撃用のAnimMontageを指定。
クラスからアクタをスポーンします
Classに遠距離攻撃武器を設定。
Attach Actor To ComponentSocket Nameに武器をアタッチするソケット名を入力。
デフォルト値

BehaviorTreeに、
BT_EnemyRangeをセットします。

遠距離から攻撃しますので、
AttackRadiusを600
DefendRadiuaを600

敵BP: BP_EnemyMelee

イベントグラフ
ノードを組む
戦闘態勢のON/OFFはBaseとは別にします。
Baseの戦闘態勢のON/OFFをそのままコピペする。

モンタージュを再生しますに近距離攻撃用のAnimMontageを指定。
クラスからアクタをスポーンします
Classに近距離攻撃武器を設定。
Attach Actor To ComponentSocket Nameに武器をアタッチするソケット名を入力。
デフォルト値

BehaviorTreeに、
BT_EnemyMeleeをセットします。

AIコントローラー: AIC_EnemyBase

ノードを組む

Run Behavior Treeの前にBP_EnamyBaseをCastしてBehavior TreeをGetする。検証済ゲットに変換して繋ぐ。

環境クエリ: EQS_FindIdealRangeLocation

BP: AI > 環境クエリ
名前: EQS_FindIdealRangeLocation
ノードを組む

・Points: Gridを配置。

・SimpleGridで右クリックしてテストを追加 > Pathfinding。
・SimpleGridで右クリックしてテストを追加 > Trace。
※Item Height Offsetは180でもいいと思います。

・SimpleGridで右クリックしてテストを追加 > Distance。

・SimpleGridで右クリックしてテストを追加 > Distance。

デコレーター: BTD_CanSeeTarget

敵がプレイヤーを見ているかどうかを確認するためのデコレーター。

BP: デコレーター
親クラス: BTDecorator_BlueprintBase
名前: BTD_CanSeeTarget
新規作成。
ノードを組む

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

ビヘイビアツリー: 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

イベントグラフ
ノードを編集
ダメージシステムの追加
ここからは敵のHPを確認しますのでダメージシステムが必要です。
汎用性と拡張性の高いダメージシステム
↑BP_PlayerとBP_EnemyBaseにBPI_DamageableとBPC_DamageSystemを追加する必要がああります。

デコレーター: BTD_IsHealthBelowThreshold

BP: デコレーター
親クラス: BTDecorator_BlueprintBase
名前: BTD_IsHealthBelowThreshold
新規作成。
ノードを組む

【変数】HealthThreshold – Float
新規作成。目玉アイコンを開ける。スライダ範囲と値の範囲をそれぞれ0~1にする。デフォルト値は0.3にします。Healthが3割以下になったら、このデコレーター以下のSequenceが実行されます。
目玉アイコンを開けていますからビヘイビアツリー上でも変更可能です。

タスク: BTTask_Heal

敵が回復するタスクです。

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

【変数】HealPercentage – Float
新規作成。目玉アイコンを開ける。スライダ範囲と値の範囲をそれぞれ0~1にする。デフォルト値を0.05にします。5%です。
目玉アイコンを開けていますからビヘイビアツリー上でも変更可能です。

ビヘイビアツリー: BT_EnemyRanged

敵AI 3:敵が逃げて隠れて再び攻撃してくるで作成したFindCoverをコピペして使います。

ビヘイビアツリーを編集
FindCover(Sequence)

BTD_IsHealthBelowThresholdのオブザーバーを中止はBoth。
BTTask_FocusTargetのAttack Target KeyはAttackTarget。

コメント

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