自分にも敵にも配置したオブジェクトにも使える、Actor Componentを用いたダメージシステム。
Ali Elzoheiry氏の動画を参考にして自分用に改造しました。
How to Build a Combat Damage System | Unreal Engine 5 Tutorial | Reusable and Flexible Design | Youtube
この記事は自分がやり直す時のために簡単にまとめているものですから、学習するならAli Elzoheiry氏の動画を視聴した方が良いです。
列挙型 E_DamageType
名前: E_DamageType
新規作成
列挙型 E_DamageResponse
名前: E_DamageResponse
新規作成
エニュミレーター
None
HitReaction
Stagger
Stun
KnockBack
・Staggerはよろめき、Stunは気絶。
構造体 S_DamageInfo
名前: S_DamageInfo
新規作成
構造体
Amount – Float
DamageType – E_DamageType
DamageResponse – E_DamageResponse
ShouldDamageInvincible – Boolean
CanBeBlocked – Boolean
CanBeParried – Boolean
ShouldForceInterrupt – Boolean
BPインターフェース BPI_Damageable
名前: 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
親クラス: Actor Component
名前: BPC_DamageSystem
新規作成
変数の追加
MaxHealth – Float ※デフォルト値50.0
IsInvincible – Boolean
IsDead – Boolean
IsInterrputible – Boolean ※デフォルト値True
IsBlocking – Boolean
関数: 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
プレイヤーキャラクターブループリント
親クラス: Character
名前: BP_Player
コンポーネントの追加
BPC_DamageSystemの詳細にMax HealthやHealthの入力項目があり、キャラ毎の設定ができます。
インターフェースの追加
インターフェース: Get Max Health
インターフェース: Get Current Health
インターフェース: Heal
インターフェース: Take Damage
インターフェース: Is Dead
イベントグラフ

・カスタムイベント BlockedのインプットはCanBeParried – Boolean。
・カスタムイベント DamageResponseのインプットはDamageResponse – E_DamageResponseとDamageCauser – Actor。
Construction Script

・イベントグラフに追加したカスタムイベントに繋げています。
BPC_DamageSystemのイベントディスパッチャーのインプット&アウトプットとカスタムイベントのインプット&アウトプットが一致している必要があります。
エネミー(敵)ブループリント
親クラス: Character
名前: BP_EnemyBase
BP_Playerを複製して名前変更。
複製しない場合はBP_Playerと同じようにインターフェースや関数を作成する。
カメラは不要なので削除。
イベントグラフ

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