敵AI 2:敵が間合いを取りながら攻撃してくる

前回の続き。敵がプレイヤーと間合いを取りつつ攻撃してくるAIです。

前回と同じく自分で見返す用のメモ程度ですから、参考元である
Smart Enemy AI | (Part 4: EQS) | Tutorial in Unreal Engine 5 (UE5) | Youtube
を視聴した方が良いです。

このシリーズのPart 4以降、EQSを多く使います。
その前に日本語のチュートリアルでEQSを勉強しておいたほうが良いでしょう。基本をわかっていないとチンプンカンプン間違いなしです。
【UE4/UE5ゲーム制作講座】EQSを使って逃げる敵を作ってみよう!【AI入門】 | Youtube
【UE4 AI入門】EQSの基本 | Youtube
【Unreal Engine】EQSを使ってプレイヤーを取り囲む・一定の距離を保つ方法【逆引きUE】【AI入門】 | Youtube

敵キャラクターのアニメーションブループリント

BP: アニメーション > アニメーションブループリント
名前: ABP_EnemyBase
・サードパーソンテンプレートにあるABP_Mannyを複製してABP_EnemyBaseにしています。

敵がプレイヤーと間合いを取りつつ攻撃してくるAIですから、敵がプレイヤーをロックしてカニ歩きするようなブレンドスペースのアニメーションを用意する必要があります。
AIのチュートリアルであるためブレンドスペースの作成方法は解説していません。

イベントグラフ
ノードを組む
敵の方向を示す変数のDirectionと、敵がプレイヤーをFocus中であることを示す変数のIsFocusingTargetが必要です。

【変数】DirectionFloat
Calculate Directionから変数へ昇格
【変数】IsFocusingTargetBoolean
Is Validから変数へ昇格
・ABP_Mannyでは最初からSequenceのThen 2まで使われています。Then 3とThen 4を追加しています。
AnimGraph > Locomotion > Idle
ノードを組む

ブレンド Poses by boolというノードを使い。敵がプレイヤーをFocus中かどうかでIdleアニメーションを切り替えています。
当然ながらFocus中(Ture)のIdleアニメーションは武器を持って構えているもの。
AnimGraph > Locomotion > Walk / Run
ノードを組む

・Walk / Runも同じように切り替える。

ブラックボード

新規キーを2つ追加します。
AttackRadiusFloat
DefendRadiusFloat

ブループリントインターフェース

BPI_EnemyAIに関数を追加します。

関数: GetIdealRange
ノードを組む

【アウトプット】AttackRadiusFloat
新規作成。
【アウトプット】DefendRadiusFloat
新規作成。

敵キャラクターのブループリント

インターフェースに追加されたGet Ideal Rangeを編集します。
インターフェース: Get Ideal Range
ノードを組む

【変数】Attack Radius – Float
リターンノードから変数へ昇格。デフォルト値は150。
【変数】Defend Radius – Float
リターンノードから変数へ昇格。デフォルト値は350。

AIコントローラー

関数: Set State as Attacking
ノードを組む
Attack Targetを変数化するために手を加えます。

【変数】AttackTargetActor
Set State as AttackingAttack Targetから変数へ昇格
イベントグラフ
ノードを組む

【変数】AttackRadiusKeyNameName
Set Value as FloatKey Nameから変数へ昇格。デフォルト値をAttackRadiusにする。
【変数】DefendRadiusKeyNameName
Set Value as FloatKey Nameから変数へ昇格。デフォルト値をDefendRadiusにする。

EnvQueryCntext

BP: ブループリント クラス > EnvQueryCntext_BlueprintBase
名前: EQS_Context_AttackTarget
ノードを組む

環境クエリ(EQS)

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

・ルートから線を伸ばしてPoints: Circleを配置。

Points: Circleで右クリックしてテストを追加 > Pathfinding

Points: Circleで右クリックしてテストを追加 > Distance
Float ValueのMinとMaxを設定することで、移動先のポイントを2つだけに限定させています。

ビヘイビアツリー

デコレーター: BTDecorator_IsWithinIdealRange
基底クラス: BTDecorator_BlueprintBase
名前: BTDecorator_IsWithinIdealRange
新規作成。
ノードを組む

【変数】IdealRangeBlackboard Key Selector
新規作成。目玉アイコンを開けておく。カテゴリをKeys(キー)にしています。
【変数】AttackTargetBlackboard Key Selector
新規作成。目玉アイコンを開けておく。カテゴリをKeys(キー)にしています。
【ローカル変数】ErrorMarginFloat
減算する(-)の左下からローカル変数へ昇格。デフォルト値を50.0にする。
タスク: BTTask_MoveToIdealRange
基底クラス: BTTask_BlueprintBase
名前: BTTask_MoveToIdealRange
新規作成。
ノードを組む

【変数】IdealRangeBlackboard Key Selector
新規作成。目玉アイコンを開けておく。カテゴリをKeys(キー)にしています。
【変数】AttackTargetBlackboard Key Selector
新規作成。目玉アイコンを開けておく。カテゴリをKeys(キー)にしています。
ビヘイビアツリー
ビヘイビアツリーを組む
中央のAttack&Cooldowm

・前回作成したChasePleyerSequenceAttackに改名しています。そこで右クリックしてデコレーターを追加 > Cooldown
Cooldownのオブザーバーを中止をLower Priority、Cool Down Timeを5.0にしています。敵は5秒に1回攻撃してくるようになります。

BTTask_MoveToIdealRangeのIdeal RangeをAttackRadius、Attack TargetをAttackTargetにする。

右のStrafeの左のSequence

BTDecorator_IsWithinIdealRangeの詳細↓

BTTask_SetMovementSpeedのSpeedをSprintingにする。
BTTask_MoveToIdealRangeのIdeal RangeをDefendRadius、Attack TargetをAttackTargetにする。

右のStrafeの右のSequence
BTTask_FocusTargetのAttack Target KeyをAttackTargetにする。
BTTask_SetMovementSpeedのSpeedをWalkingにする。
Run EQS Queryの詳細↓

・その右のMove ToはAcceptable Radiusを10.0、Blackboard KeyをPointOfInterestにする。
・その右のWaitはWait Timeが0.3、Random Deviationが0.2。これで0.1~0.5のランダムな値になります。

参考元

Smart Enemy AI | (Part 4: EQS) | Tutorial in Unreal Engine 5 (UE5) | Youtube

ちゃんとしたゲームらしくなった

前回に引き続き、今回のチュートリアルも難しかったですが、クオリティが高くて満足です。敵が突っ込んでくるだけじゃなくて間合いを取るようになるだけで、ちゃんとしたゲームっぽくなります。

前回と同様に、自分でやり直す時のためにブログにまとめているメモ程度のものですから参考にはなりにくいでしょう。Ali Elzoheiry氏のチュートリアルを見ることをオススメします。

コメント

  1. […] 敵AI:敵がルートを巡回しプレイヤーや音に気付くと反応 敵AI 2:敵が間合いを取りながら攻撃してくる 敵AI […]

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