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

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

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

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

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

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

プロジェクタイル: BP_ProjectileMagicBall

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

Actor Component: BPC_Attacks

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

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

遠距離攻撃のAnimMontage

遠距離攻撃(魔法弾)のアニメーションを入手。
Street Fighter Hadouken | Mixamo

AnimMontageを作成。
通知ステート > Montage Notifyを追加し、名前をMagicBallにしました。
魔法弾を出したいタイミングに配置。

敵キャラクターBP: BP_EnemyBase

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

【変数】
AttackTarget – Actor
イベント Enemy Attack(BPI Enemy AI から)のインプットから変数へ昇格
AttackNotifyName – Name
モンタージュを再生Notify Nameから変数へ昇格
セット AttackNotifyNameの後に名前でスイッチを配置しても良いです。現状はNotifyがあるAnimMontageは全てShootへと繋がります。
イベントグラフ Shoot
・銃弾や矢などはAnimMontageのMontae Notifyで判定してこのShootに繋げます。
・ここではプレイヤーに向かって銃弾や矢を撃つ計算をしています。
射出される弾や矢の種類は違いますので、Notify Name別でPistol Arrowなどに分けます。

近距離タイプの敵

武器のスタティックメッシュ

敵が使用する武器のスタティックメッシュを開く。

ソケットマネージャーでソケットを2つ追加。
名前はSocket_BottomとSocket_Top。
武器の当たり判定の根元にSocket_Bottom、先端のちょっと先にSocket_Topを配置する。

プレイヤーキャラクターBP: BP_Player

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

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

イベントグラフ

BPC_DamageSystemをプレイヤーキャラクターBPに実装した場合の攻撃トレースのノードです。Apply DamageだったところをTaka Damage (ターゲットはBPI Damageable)に置き換えています。
Taka Damage (ターゲットはBPI Damageable)の後のブランチのFalseはDelayに繋げる必要があります。これをしないと、敵に攻撃をブロックされた後などに攻撃が当たらなくなります。

ノードを組む 前半

ノードを組む 後半

敵キャラクターBP: BP_EmemyBase

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

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

【変数】
WeaponHitActor – Actor
Break Hit ResultHit Actorから変数へ昇格
MeleeWeaponAttack – Float
S_DamageInfoを作成Amountから変数へ昇格
TakeDamageWeapn Hit Actorから線を伸ばして(メッセージ)です。

ANS_WeaponTraceLoop_Enemy

BP: ブループリント クラス
親クラス: AnimNotifyState
名前: ANS_WeaponTraceLoop_Enemy
・新規作成。
・今回は敵用のものですが、これはプレイヤー用にもできます。プレイヤー用なら名前はANS_WeaponTraceLoopで良いでしょう。
既にプレイヤー用を作成済なら複製してCast To BP_EnemyBaseCast To BP_Playerに変更し、その後の関数も変更。Received Notify Tickはプレイヤー専用なので削除。
関数オーバーライド:  Received_NotifyBegin

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

ノードを組む

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

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

ノードを組む

Cast To BP_EnemyBaseCast To BP_Playerに変更し、関数も置き換えればプレイヤー用にも使えます。

敵の攻撃のAnimMontage

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

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

敵の死亡処理

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

AIコントローラー: AIC_EnemyBase

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

関数: SetStateAsDead
ノードを組む

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

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

Is Deadブランチを追加。

サービス: 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
新規作成。
エニュメレーター
None
Blocking
BlockingSucessfully

ブロックのAnimMontage

敵が攻撃をブロックするアニメーションが必要です。
Blocking An Attack With Axe | Mixamo
アニメーションシーケンスのEnableRootMotionとForce Root Lockにチェックを入れる。

AnimMontageを作成。

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

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

敵BP: BP_EmemyBase

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

【イベントディスパッチャー】
OnBlockEnd
【変数】
BlockingState – E_BlockingState
└新規作成。
HoldBlockTimer – Timer Handle
Clear and Invalidate Timer by HandleHandleから変数へ昇格
BlockMontage – Anim Montage
モンタージュを再生Montage to Playから変数へ昇格
On BlockedはBPC_DamageSystemの詳細から配置します。
関数: 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をコピーしました