複数のビヘイビアツリーを作り、近距離タイプと遠距離タイプの敵を分ける。
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にセットする。
アニメーションを用意する
遠距離タイプの敵ですから、銃、弓矢、魔法などが考えられます。
今回は弓矢にしました。
■弓矢装備
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
・新規作成
弓矢のアセットをダウンロード
解凍してBowの中身とArrowの中身とcube.FBXをUE5にインポート。
インポートオプションは「デフォルトにリセット」してそのまま何も変更せず。
エラーは気にしない。
BOW_DefaultMaterial_MetallicとBOW_DefaultMaterial_Roughnessのテクスチャ > sRGBのチェックを外す。
マテリアル: M_Bow
名前: M_Bow
・新規作成。
スケルタルメッシュ: BOWunreal
BOWunrealを開き、マテリアルスロットにM_Bowをセットしてください。
Bowに名前変更しても良いでしょう。
マテリアル: M_Arrow
名前: M_Arrow
・新規作成。
スケルタルメッシュ: arrowyfbx
arrowyfbxを開き、マテリアルスロットにM_Arrowをセットしてください。
Arrowに名前変更しても良いでしょう。
マテリアル: M_lightTransperent
M_lightTransperentを開く。
マテリアル > Blend Modeを「Translucent」にする。
敵のスケルトン
弓や銃を持つ場合、スケルトンに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_WeaponBaseで右クリックして「子ブループリント クラスを作成します」を選択。
StaticMeshにSword(剣)のメッシュをセットする。
アクターBP(子): BP_Weapon_Bow
・BP_WeaponBaseで右クリックして「子ブループリント クラスを作成します」を選択。
SkeletalMeshにBow(弓)のメッシュをセットする。
ビヘイビアツリー
複数のビヘイビアツリーを管理するので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をそのままコピペする。
モンタージュを再生のMontage to Playに遠距離攻撃用のAnimMontageを指定。
クラスからアクタをスポーンしますのClassに遠距離攻撃武器を設定。
Attach Actor To ComponentのSocket 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 ComponentのSocket Nameに武器をアタッチするソケット名を入力。
デフォルト値
BehaviorTreeに、
BT_EnemyMeleeをセットします。
AIコントローラー: AIC_EnemyBase
環境クエリ: EQS_FindIdealRangeLocation
名前: EQS_FindIdealRangeLocation
デコレーター: BTD_CanSeeTarget
敵がプレイヤーを見ているかどうかを確認するためのデコレーター。
親クラス: 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
イベントグラフ
ダメージシステムの追加
汎用性と拡張性の高いダメージシステム
デコレーター: 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。
コメント