Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

LyraGameのコードリーディングーキャラが死ぬときー

LyraサンプルはGameplayAbilitySystemが多様されていて難解なため、自分の備忘録としてまとめていく。同じようにコードリーディングしていく人の手助けになったらいいな。

GameplayAbilitySystem(以下GAS)が何なのか?についてはスタミナを消費させてみるサンプルを自分でやってみてからのほうが理解が進む。

https://historia.co.jp/archives/17941/

コードを読んでみた感想

キャラのHP管理~死亡処理についても例にもれずGASで実装されている。

大まかな流れとしては ULyraHealthComponentがHealthSetを持ちHPを監視していて、HPと死亡状態の管理を行っている。 死亡時演出はGameplayAbility_Deathをキックしている。継承したBPの方で死亡時カメラや暗転までの時間調整がされているようだ。

死亡時に他の操作をブロックしたいので、BlockやCancelするタグが設定されている。Abilityで色々実装していると、死んだ場合は操作不能にできるので便利。

死亡演出について

HealthComponentには

  • 死んでない(ELyraDeathState::NotDead)
  • 死亡中(ELyraDeathState::DeathStarted)
  • 死亡完了(ELyraDeathState::DeathFinished)

の3つの状態がある。ULyraHealthComponent::StartDeath(), ULyraHealthComponent::FinishDeath()を呼び出すことで状態を変えられる。

この二つの状態変化させる関数はULyraGameplayAbility_DeathとULyraHealthComponentのどちらかから呼ばれる。ULyraHealthComponentから呼ばれるケースはネットワーク同期するケースのように見えるので一旦無視する

StartDeath()は死亡演出アビリティのアクティベート時(ULyraGameplayAbility_Death::ActivateAbility())、FinishDeath()はアビリティの終了時(ULyraGameplayAbility_Death::EndAbility)に呼ばれる。

この死亡演出アビリティを継承して使って演出を差し込んでいく使い方を想定していると思われる。

死亡判定

HPはULyraHealthSetに値の実体があり、GamePlayEffectを経由してHealthを減らしている。

死亡判定の流れとしては、

HealthComponent::InitializeWithAbilitySystemでHealthSet::OnOutOfHealthイベントに登録してイベント通知を受けられるようにして

以下のような流れで死亡演出のアビリティを呼び出している

  1. ULyraHealthSet::PostGameplayEffectExecuteでHPが0だったら
  2. ULyraHealthComponent::HandleOutOfHealth でAbilitySystemComponentにGameplayEvent.Deathを送信して、GameplayAbility_Deathが起動する
  3. GameplayAbility_DeathからULyraHealthComponent::StartDeathが呼ばれる