敵の攻撃とブロックと共通の攻撃システムの作成。
敵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
親クラス: Actor Component
名前: BPC_Attacks
新規作成。
遠距離攻撃のAnimMontage
遠距離攻撃(ピストル)のAnimMontageに通知ステート > Montage Notifyを追加し、名前をPistolFireにしました。元々はFireでしたが、細かく対応するためにPistolFireにしました。
敵BP: BP_EnemyBase

【変数】AttackTarget – Actor
イベント Enemy AttackのAttack Targetから変数へ昇格。変数化せずに直接繋いでも構いません。
・銃弾や矢などはAnimMontageのMontae Notifyで判定してこのFireに繋げます。
ここではプレイヤーに向かって銃弾や矢を撃つ計算をしています。
射出される弾や矢の種類は違いますので、Notify Name別でPistol FireやShoot 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 EventのReturn Valueから変数へ昇格。
・Sphere Trace By ChannelのRadiusは変数化して子ブループリントで編集しやすくしても良いです。武器の太さになる値。

【変数】HitActor – Actor
Break Hit ResultのHit Actorから変数へ昇格。
・TakeDamageはHit Actorから線を伸ばして(メッセージ)です。
ANS_SwordTraceLoop_Enemy
親クラス: AnimNotifyState
名前: ANS_SwordTraceLoop_Enemy
新規作成。
今回は敵用のものですが、これはプレイヤー用にもできます。
関数オーバーライド: Received_NotifyBegin
これは武器のTraceを有効にするノードです。
関数オーバーライド: Received_NotifyEnd
これは武器のTraceを無効にするノードです。
敵の攻撃のAnimMontage
通知ステートを追加 > ANS_SwordTraceLoop_Enemy。
敵の攻撃の当たり判定があってほしい部分に配置する。
プレイヤー用にもANS_SwordTraceLoopを作れば同じように追加して機能します。
敵の死亡処理
ダメージシステムを導入した時に敵の死亡処理は作られていますが、AIコントローラーとの連動で追加するところがあります。
AIコントローラー: AIC_EnemyBase
DeadとStunのStateを追加します。
関数: SetStateAsDead
関数: SetStateAsStun
関数: SetStateAsAttacking
サービス: BTS_StopAttackngIfTargetIsDead
名前: BTS_StopAttackngIfTargetIsDead
新規作成。タスクやデコレーターと同じようにビヘイビアツリーから作成できます。
敵BP: BP_EmemyBase
イベントグラフ

【変数】AIC_EnemyBase_Ref – AIC Enemy Base
Cast To AIC_EnemyBaseのAs AIC EnemyBaseから変数へ昇格。
【変数】HitReactionMontage – Anim Montage
モンタージュを再生のMontage To Playから変数へ昇格。
ビヘイビアツリー: BT_SubTree_Stun
名前: BT_SubTree_Stun
新規作成。
ビヘイビアツリー: BT_EnemyRanged & BT_EnemyMelee
スタンの設定
対象が死亡時は攻撃しないようにする設定

・CombatState(Selector)にサービスのBTS_StopAttackngIfTargetIsDeadを追加。
Intervalの1.0は1秒ごとにチェックされるということです。
ブロック
列挙型: E_BlockingState
名前: 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 DamageのDamage InfoのCan be Blockedにチェックが入っている攻撃のみがブロック対象です。
コメント