敵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にセットする。

アニメーションを用意する

遠距離タイプの敵ですから、銃、弓矢、魔法などが考えられます。
今回は弓矢にしました。

■弓矢装備
Standing Equip Bow | Mixamo
■弓矢装備解除
Standing Disarm Bow | Mixamo
■背中から矢を取って弓にセット
Standing Draw Arrow Reloading Bow | Mixamo
■構えた弓から手を離して発射
Standing Aim Recoil | Mixamo
■弓を持ったアイドルアニメーション
Standing Idle With Bow | Mixamo
■弓を持って移動するアニメーション(4方向)
Walking Backwards With Bow | Mixamo
Walking Forward With Bow | Mixamo
Walking Left With Bow | Mixamo
Walking Right With Bow | Mixamo
Running Backwards With Bow | Mixamo
Running Forward With Bow | Mixamo
Running Left With Bow | Mixamo
Running Right With Bow | Mixamo
■弓を構えたアイドルアニメーション
Aiming Idle With Bow | Mixamo
■弓を構えて移動するアニメーション(4方向)
Walking Backwards Aiming With Bow | Mixamo
Walking Forward Aiming With Bow | Mixamo
Walking Left While Aiming With Bow | Mixamo
Walking Right While Aiming With Bow | Mixamo

アニメーションの設定

EnableRootMotionとForce Root Lock

UE5にインポートした全てのアニメーションシーケンスのEnableRootMotionとForce Root Lockにチェックを入れる。
※全てのアニメーションシーケンスを選択した状態で右クリックしてアセット アクション > プロパティ マトリクスで選択内容を編集しますで一括変更できるウィンドウが開きます。

Standing Aim RecoilだけはEnableRootMotionとForce Root Lockのチェックを外す。チェックがあると回転できないので、プレイヤーを狙っている時にプレイヤーが動いても敵は向きを変えません。

武器装備ON/OFF

今回の例ではStanding Equip BowとStanding Disarm Bowが武器装備のON/OFF。

まずAnimMontageを作成。

AnimMontageを開き、通知欄で通知を追加 > MontageNotify
弓を持ったり離したりするところに配置。
Notify NameはHoldWeaponとDropWeapon。

矢を放つ

今回の例ではStanding Aim Recoilが矢を放つアニメーション。

まずAnimMontageを作成。

AnimMontageを開き、通知欄で通知を追加 > MontageNotify
矢を放つところに配置。
Notify NameはShoot。

通知を追加 > PlaySoundで発射音もセットすると良いでしょう。

通知を追加 > PlayPerticleEffectでエフェクトを追加できます。
エフェクトはSocket名を指定して、そこを基準にLocation Offsetで位置調整ができます。

ブレンドスペース: BS_WalkRun_Bow
アニメーション > ブレンドスペース
スケルトン: SK_Mannequin
名前: BS_WalkRun_Bow
・新規作成
軸の設定
アニメーションシーケンスを配置

弓矢のアセットをダウンロード

Asset_Bow

解凍してBowの中身とArrowの中身とcube.FBXをUE5にインポート。
インポートオプションは「デフォルトにリセット」してそのまま何も変更せず。
エラーは気にしない。

BOW_DefaultMaterial_MetallicとBOW_DefaultMaterial_Roughnessのテクスチャ > sRGBのチェックを外す。

マテリアル: M_Bow
マテリアル
名前: M_Bow
・新規作成。
ノードを組む

・各Textureはドラッグ&ドロップで配置できます。
・「適用」して「保存」。
スケルタルメッシュ: BOWunreal

BOWunrealを開き、マテリアルスロットにM_Bowをセットしてください。
Bowに名前変更しても良いでしょう。

マテリアル: M_Arrow
マテリアル
名前: M_Arrow
・新規作成。
ノードを組む
スケルタルメッシュ: arrowyfbx

arrowyfbxを開き、マテリアルスロットにM_Arrowをセットしてください。
Arrowに名前変更しても良いでしょう。

マテリアル: M_lightTransperent

M_lightTransperentを開く。

マテリアル > Blend Modeを「Translucent」にする。

ノードを組む

・Constant3Vectorは3キーを押しながら左クリックで出せます。
・「0」のノードは1キーを押しながら左クリックで出せます。

敵のスケルトン

弓や銃を持つ場合、スケルトンにSocketを追加する必要がありますので、設定してください。

hand_lにソケットを追加して、hand_l_bowにしました。

プレビューアセットにBowを追加して位置と向きの調整。

アニメーションブループリント: ABP_Enemy_Ranged

AnimGraph

Locomotion > IdleのTrue側に遠距離武器用のアニメーションシーケンスをセットする。
今回の例ではStanding Idle With Bow。

Locomotion > Walk/RunのTrue側に遠距離武器用のブレンドスペースをセットする。
今回の例ではBS_WalkRun_Bow。

アクターBP: BP_WeaponBase

複数の武器を管理するようになりますから、武器のベースとなるブループリントを作成します。

以前作成して既にBP_EnamyBaseのイベントグラフにもセットしてあるBP_AxeをBP_WeaponBaseに名前変更しました。

このブループリントはStaticMeshがセットされていますが、SkeletalMeshも追加しました。

このBaseではStaticMeshもSkeletalMeshも空でいいです。
コリジョンは必ずNoCollision。

アクターBP(子): BP_Weapon_Sword

名前: BP_Weapon_Sword
・BP_WeaponBaseで右クリックして「子ブループリント クラスを作成します」を選択。

StaticMeshにSword(剣)のメッシュをセットする。

アクターBP(子): BP_Weapon_Bow

名前: BP_Weapon_Bow
・BP_WeaponBaseで右クリックして「子ブループリント クラスを作成します」を選択。

SkeletalMeshにBow(弓)のメッシュをセットする。

ビヘイビアツリー

複数のビヘイビアツリーを管理するので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をそのままコピペする。
モンタージュを再生のMontage to Playに遠距離攻撃用のAnimMontageを指定。
クラスからアクタをスポーンします
Classに遠距離攻撃武器を設定。
Attach Actor To ComponentSocket Nameに武器をアタッチするソケット名を入力。
デフォルト値

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

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

BP_EnemyBaseの攻撃ノードで変数化しておいたNormalAttackとHeavyAttackに弓矢の攻撃AnimMontageをセットしてください。
ちなみにStanding Aim Recoilをそのままセットすると、敵が移動した後、構える時間がほぼないまま発射します。AnimMontageを編集して頭に待ち時間を入れると見映えがよくなります。
AnimMontageのアセットブラウザからStanding Aim Recoilをもう1つ入れて、頭に配置。そのEnd Timeを0.01にする。Play Rateを0.005にすれば、構えた状態で2秒ほど待ちます。

敵BP: BP_EnemyMelee

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

モンタージュを再生のMontage to Playに近距離攻撃用の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
└新規作成。目玉アイコンを開ける。
・敵の視線がライントレースになっています。StartとEndに繋げるのはGet Actor Locationでも良いのですが、これだと視線がそれぞれお尻の高さになり、プレイヤーが腰の高さの壁に隠れても敵からは見えません。
目の高さであるGet Actor Eyes View Pointを使用しています。問題があれば、Get Actor Locationに置き換えた方が良いでしょう。

ビヘイビアツリー: 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、Valueは500、BBKeyはAttackRadius、Run ModeはSingle Random Item from Best 25%、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、Valueは500、BBKeyはAttackRadius、Run ModeはSingle Best Item、Blackboard KeyはPointOfInterest。
Move ToのBlackboard KeyはPointOfInterest。

敵BP: BP_EnemyBase

イベントグラフ
ノードを編集

・矢を放つAnimMontageに設定していたShootというNotify Nameからカスタムイベント Shootに繋げています。
ダメージシステムの追加
ここからは敵の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をコピーしました