敵の攻撃とブロックと共通の攻撃システムの作成。
敵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
親クラス: Actor Component
名前: BPC_Attacks
新規作成。
遠距離攻撃のAnimMontage
遠距離攻撃(魔法弾)のアニメーションを入手。
Street Fighter Hadouken | Mixamo
AnimMontageを作成。
通知ステート > Montage Notifyを追加し、名前をMagicBallにしました。
魔法弾を出したいタイミングに配置。
敵キャラクターBP: BP_EnemyBase
【変数】
AttackTarget – Actor
└イベント Enemy Attack(BPI Enemy AI から)のインプットから変数へ昇格。
AttackNotifyName – Name
└モンタージュを再生のNotify Nameから変数へ昇格。
・セット AttackNotifyNameの後に名前でスイッチを配置しても良いです。現状はNotifyがあるAnimMontageは全て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 EventのReturn Valueから変数へ昇格。
・Sphere Trace By ChannelのRadiusは変数化して子ブループリントで編集しやすくしても良いです。武器の太さになる値。
【変数】
WeaponHitActor – Actor
└Break Hit ResultのHit Actorから変数へ昇格。
MeleeWeaponAttack – Float
└S_DamageInfoを作成のAmountから変数へ昇格。
・TakeDamageはWeapn Hit Actorから線を伸ばして(メッセージ)です。
ANS_WeaponTraceLoop_Enemy
親クラス: AnimNotifyState
名前: ANS_WeaponTraceLoop_Enemy
・新規作成。
・今回は敵用のものですが、これはプレイヤー用にもできます。プレイヤー用なら名前はANS_WeaponTraceLoopで良いでしょう。
既にプレイヤー用を作成済なら複製してCast To BP_EnemyBaseをCast To BP_Playerに変更し、その後の関数も変更。Received Notify Tickはプレイヤー専用なので削除。
関数オーバーライド: Received_NotifyBegin
これは武器のTraceを有効にするノードです。
関数オーバーライド: Received_NotifyEnd
これは武器のTraceを無効にするノードです。
敵の攻撃のAnimMontage
通知ステートを追加 > ANS_WeaponTraceLoop_Enemy。
敵の攻撃の当たり判定があってほしい部分に配置する。
プレイヤー用にもANS_WeaponTraceLoopを作れば同じように追加して機能します。
敵の死亡処理
ダメージシステムを導入した時に敵の死亡処理は作られていますが、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
新規作成。
エニュメレーター
BlockingSucessfully
ブロックのAnimMontage
敵が攻撃をブロックするアニメーションが必要です。
Blocking An Attack With Axe | Mixamo
アニメーションシーケンスのEnableRootMotionとForce Root Lockにチェックを入れる。
AnimMontageを作成。
ブロックした後に解除する動作があってはいけません。それが含まれている場合はAnimMontageの詳細のEnd Timeを短くしてカットしましょう。
このAnimMontageの長さがそのままブロックモーションの長さです。短すぎる場合は詳細のLoop Countを2にして倍にすると良いでしょう。
敵BP: BP_EmemyBase
イベントグラフ
【イベントディスパッチャー】
OnBlockEnd
【変数】
BlockingState – E_BlockingState
└新規作成。
HoldBlockTimer – Timer Handle
└Clear and Invalidate Timer by HandleのHandleから変数へ昇格。
BlockMontage – Anim Montage
└モンタージュを再生のMontage to Playから変数へ昇格。
・On BlockedはBPC_DamageSystemの詳細から配置します。
関数: TryBlock
【変数】
BlockChance – Float
└以下(<=)から変数へ昇格。ブロック確率です。0.0~1.0の値で、例えば0.3なら30%の確率でブロック。1.0なら100%ブロックします。
攻撃側のキャラクターのTake DamageのDamage InfoのCan be Blockedにチェックが入っている攻撃のみがブロック対象です。
コメント