敵AI 5:敵の攻撃とブロック

敵の攻撃とブロックと共通の攻撃システムの作成。

敵AIの第5回になります。過去記事で作成したものが必須になります。
敵AI:敵がルートを巡回しプレイヤーや音に気付くと反応
敵AI 2:敵が間合いを取りながら攻撃してくる
敵AI 3:敵が逃げて隠れて再び攻撃してくる
敵AI 4:近距離タイプと遠距離タイプの敵を分ける
汎用性と拡張性の高いダメージシステム

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

共通の攻撃システムの作成

プレイヤーも敵も共用できる攻撃システム。
今回はピストルでの銃撃を作成します。

プロジェクタイル: BP_Projectile

ピストルの弾をプロジェクタイルにしますので、下記を参考にBP_Projectile_Pistolを作成します。
プロジェクタイル(Projectile)の基本

Actor Component: BPC_Attacks

BP: ブループリント クラス
親クラス: Actor Component
名前: BPC_Attacks
新規作成。
ノードを組む

【イベントディスパッチャー】OnAttackEnd
Get OwnerのターゲットはActor Componentです。

遠距離攻撃のAnimMontage

遠距離攻撃(ピストル)のAnimMontageに通知ステート > Montage Notifyを追加し、名前をPistolFireにしました。元々はFireでしたが、細かく対応するためにPistolFireにしました。

敵BP: BP_EnemyBase

コンポーネントにBPC_Attacksを追加する。
イベントグラフ Enemy Attack

【変数】AttackNotifyName – Name
モンタージュを再生Notify Nameから変数へ昇格
イベントグラフ Fire

【変数】AttackTarget – Actor
イベント Enemy AttackAttack Targetから変数へ昇格。変数化せずに直接繋いでも構いません。
・銃弾や矢などはAnimMontageのMontae Notifyで判定してこのFireに繋げます。
ここではプレイヤーに向かって銃弾や矢を撃つ計算をしています。
射出される弾や矢の種類は違いますので、Notify Name別でPistol FireShoot Arrowなどに分けます。

近距離タイプの敵

BP_WeaponBaseと子ブループリント

BP_WeaponBaseのコンポーネントにArrowを2つ追加する。
名前はWeaponTopPointとWeaponBottomPoint。
方向に意味があるかはわかりませんが、X軸を向かい合わせています。

子ブループリントの近接武器で、武器のダメージが当たる部分に合わせてWeaponTopPointとWeaponBottomPointの位置を調整。
この2つのPointの間がトレースされます。
実際の武器よりも長くしないと敵の攻撃が届かなくて当たりません。

プレイヤーBP: BP_Player

クラスのデフォルト > アクタ > Tagsを追加。
Tagの名前はPlayer。

このPlayerというタグがあるアクターに対してのみ、敵の攻撃が当たるようにします。敵同士のフレンドリーファイアもアリにするなら不要。

敵BP: BP_EmemyBase

イベントグラフ
ノードを組む 前半

【変数】SwordTraceLoopTimer – Timer Handle
Set Timer by EventReturn Valueから変数へ昇格
Sphere Trace By ChannelRadiusは変数化して子ブループリントで編集しやすくしても良いです。武器の太さになる値。
ノードを組む 後半

【変数】HitActor – Actor
Break Hit ResultHit Actorから変数へ昇格
TakeDamageHit Actorから線を伸ばして(メッセージ)です。

ANS_SwordTraceLoop_Enemy

BP: ブループリント クラス
親クラス: AnimNotifyState
名前: ANS_SwordTraceLoop_Enemy
新規作成。
今回は敵用のものですが、これはプレイヤー用にもできます。
関数オーバーライド:  Received_NotifyBegin

これは武器のTraceを有効にするノードです。

ノードを組む

Cast To BP_EnemyBaseCast To BP_Playerに変更すればプレイヤー用にも使えます。
関数オーバーライド: Received_NotifyEnd

これは武器のTraceを無効にするノードです。

ノードを組む

Cast To BP_EnemyBaseCast To BP_Playerに変更すればプレイヤー用にも使えます。

敵の攻撃のAnimMontage

通知ステートを追加 > ANS_SwordTraceLoop_Enemy。
敵の攻撃の当たり判定があってほしい部分に配置する。

プレイヤー用にもANS_SwordTraceLoopを作れば同じように追加して機能します。

敵の死亡処理

ダメージシステムを導入した時に敵の死亡処理は作られていますが、AIコントローラーとの連動で追加するところがあります。

AIコントローラー: AIC_EnemyBase

DeadとStunのStateを追加します。

関数: SetStateAsDead
ノードを組む

SetStateAsPassiveを複製して名前をSetStateAsDeadにしてEnumをDeadにするだけです。
関数: SetStateAsStun
ノードを組む

SetStateAsPassiveを複製して名前をSetStateAsStunにしてEnumをStunにするだけです。
関数: SetStateAsAttacking
ノードの編集

サービス: BTS_StopAttackngIfTargetIsDead

BP: サービス
名前: BTS_StopAttackngIfTargetIsDead
新規作成。タスクやデコレーターと同じようにビヘイビアツリーから作成できます。
ノードを組む

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

敵BP: BP_EmemyBase

イベントグラフ
ノードを組む

【変数】AIC_EnemyBase_Ref – AIC Enemy Base
Cast To AIC_EnemyBaseAs AIC EnemyBaseから変数へ昇格
【変数】HitReactionMontage – Anim Montage
モンタージュを再生Montage To Playから変数へ昇格

ビヘイビアツリー: BT_SubTree_Stun

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

・フォーカスをクリアして5秒間止まるだけです。

ビヘイビアツリー: BT_EnemyRanged & BT_EnemyMelee

スタンの設定
ビヘイビアツリーを組む
それぞれのツリーの一番左に配置します。
Blackboard Based Conditionの詳細。

InvestigatingStun(RunBehavior)の詳細。
対象が死亡時は攻撃しないようにする設定
ビヘイビアツリーを組む

CombatState(Selector)にサービスのBTS_StopAttackngIfTargetIsDeadを追加。
Intervalの1.0は1秒ごとにチェックされるということです。

ブロック

列挙型: E_BlockingState

BP: ブループリント > 列挙型
名前: E_BlockingState
新規作成。

ブロックのAnimMontage

敵が攻撃をブロックするAnimMontageが必要です。

ブロックした後に解除する動作があってはいけません。それが含まれている場合はAnimMontageの詳細のEnd Timeを短くしてカットしましょう。

このAnimMontageの長さがそのままブロックモーションの長さです。短すぎる場合は詳細のLoop Countを2にして倍にすると良いでしょう。

敵BP: BP_EmemyBase

関数: TryBlock
ノードを組む

【変数】BlockChance – Float
以下から変数へ昇格。ブロック確率です。0.0~1.0の値で、例えば0.3なら30%の確率でブロック。1.0なら100%ブロックします。
攻撃側のキャラクターのTake DamageDamage InfoCan be Blockedにチェックが入っている攻撃のみがブロック対象です。
インターフェース: TakeDamage
ノードを組む
イベントグラフ
ノードを組む Block

【イベントディスパッチャー】OnBlockEnd
【変数】Hold Block Timer – Timer Handle
Set Timer by EventReturn Valueから変数へ昇格
【変数】BlockMontage – Anim Montage
モンタージュを再生Montage to Playから変数へ昇格

コメント

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