汎用性と拡張性の高いダメージシステム

自分にも敵にも配置したオブジェクトにも使える、Actor Componentを用いたダメージシステム。

Ali Elzoheiry氏の動画を参考にして自分用に改造しました。
How to Build a Combat Damage System | Unreal Engine 5 Tutorial | Reusable and Flexible Design | Youtube
この記事は自分がやり直す時のために簡単にまとめているものですから、学習するならAli Elzoheiry氏の動画を視聴した方が良いです。

列挙型 E_DamageType

BP: ブループリント > 列挙型
名前: E_DamageType
新規作成
エニュミレーター
None
Melee
Projectile
Explosion
Environment

列挙型 E_DamageResponse

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

エニュミレーター
None
HitReaction
Stagger
Stun
KnockBack

・Staggerはよろめき、Stunは気絶。

構造体 S_DamageInfo

BP: ブループリント > 構造体
名前: S_DamageInfo
新規作成

構造体
Amount – Float
DamageType – E_DamageType
DamageResponse – E_DamageResponse
ShouldDamageInvincible – Boolean
CanBeBlocked – Boolean
CanBeParried – Boolean
ShouldForceInterrupt – Boolean

BPインターフェース BPI_Damageable

BP: ブループリント > ブループリントインターフェース
名前: BPI_Damageable
新規作成
関数:GetCurrentHealth

アウトプット
Health – Float

関数:GetMaxHealth

アウトプット
MaxHealth – Float

関数:Heal

インプット
Amount – Float

アウトプット
NewHealth – Float

関数: TakeDamage

インプット
DamageInfo – S_DamageInfo
DamageCauser – Actor
※DamageCauserの入力が無効になる場合はDamage Causerにする。

アウトプット
WasDamaged – Boolean

関数: IsDead

アウトプット
Dead – Boolean

Actor Component: BPC_DamageSystem

BP: ブループリント クラス
親クラス: Actor Component
名前: BPC_DamageSystem
新規作成
変数の追加
Health – Float ※デフォルト値50.0
MaxHealth – Float ※デフォルト値50.0
IsInvincible – Boolean
IsDead – Boolean
IsInterrputible – Boolean ※デフォルト値True
IsBlocking – Boolean
・配置する時にIsInvincibleとIsInterrputibleを間違えないように。私は間違えました。
関数: Heal

インプット
Amount – Float

アウトプット
NewHealth – Float

ノードを組む
マクロ: CanBeDamaged

インプット
Then – Exes(実行)
ShouldDamageInvincible – Boolean
CanBeBlocked – Boolean

アウトプット
BlockDamage – Exes(実行)
DoDamage – Exes(実行)
NoDamage – Exes(実行)

ノードを組む
関数: TakeDamage

インプット
DamageInfo – S_DamageInfo
DamageCauser – Actor
※DamageCauserの入力が無効になる場合はDamage Causerにする。

アウトプット
WasDamaged – Boolean

イベントディスパッチャー
OnDeath
OnBlocked
└インプット: CanBeParried – Boolean
OnDamageResponse
├インプット: DamageResponse – E_DamageResponse
└インプット: DamageCauser – Actor

ノードを組む

プレイヤーキャラクターブループリント

BP: ブループリント クラス
親クラス: Character
名前: BP_Player
コンポーネントの追加
コンポーネントに+追加、BPC_DamageSystemを選択。
BPC_DamageSystemの詳細にMax HealthやHealthの入力項目があり、キャラ毎の設定ができます。
インターフェースの追加
クラス設定 > インターフェース > 実装インターフェースにBPI_Damageableを追加。
インターフェース: Get Max Health
ノードを組む
インターフェース: Get Current Health
ノードを組む
インターフェース: Heal
ノードを組む
インターフェース: Take Damage
ノードを組む
インターフェース: Is Dead
ノードを組む
イベントグラフ
ノードを組む

カスタムイベント BlockedのインプットはCanBeParried – Boolean
カスタムイベント DamageResponseのインプットはDamageResponse – E_DamageResponseとDamageCauser – Actor
Construction Script
ノードを組む

・イベントグラフに追加したカスタムイベントに繋げています。
BPC_DamageSystemのイベントディスパッチャーのインプット&アウトプットとカスタムイベントのインプット&アウトプットが一致している必要があります。

エネミー(敵)ブループリント

BP: ブループリント クラス
親クラス: Character
名前: BP_EnemyBase
BP_Playerを複製して名前変更。
複製しない場合はBP_Playerと同じようにインターフェースや関数を作成する。
カメラは不要なので削除。
イベントグラフ
ノードを組む

カスタムイベント BlockedのインプットはCanBeParried – Boolean
カスタムイベント DamageResponseのインプットはDamageResponse – E_DamageResponseとDamageCauser – Actor
・プレイヤーキャラクターではないのでDisable Inputは不要。

攻撃例

ノードを組む

・よく使うApply Damageではなく、HitActorに対してTake Damageを使います。

コメント

  1. Reid Affolter より:

    Excellent write-up

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