feat: 무적 이상상태 기반 구르기 스킬 정리

- 무적 이상상태 데이터와 효과 에셋을 추가
- 구르기를 일반 스킬이 무적 상태를 부여하는 구조로 변경
- 대미지 처리와 플레이어 상태 판정이 무적 이상상태를 참조하도록 정리
This commit is contained in:
2026-03-19 19:16:32 +09:00
parent 0c26853b2a
commit 287ff4dc83
15 changed files with 166 additions and 55 deletions

View File

@@ -26,11 +26,13 @@ namespace Colosseum.Abnormalities
// 제어 효과 상태
private int stunCount;
private int silenceCount;
private int invincibleCount;
private float slowMultiplier = 1f;
// 클라이언트 판정용 제어 효과 동기화 변수
private NetworkVariable<int> syncedStunCount = new NetworkVariable<int>(0);
private NetworkVariable<int> syncedSilenceCount = new NetworkVariable<int>(0);
private NetworkVariable<int> syncedInvincibleCount = new NetworkVariable<int>(0);
private NetworkVariable<float> syncedSlowMultiplier = new NetworkVariable<float>(1f);
// 네트워크 동기화용 데이터
@@ -46,6 +48,11 @@ namespace Colosseum.Abnormalities
/// </summary>
public bool IsSilenced => GetCurrentSilenceCount() > 0;
/// <summary>
/// 무적 상태 여부
/// </summary>
public bool IsInvincible => GetCurrentInvincibleCount() > 0;
/// <summary>
/// 이동 속도 배율 (1.0 = 기본, 0.5 = 50% 감소)
/// </summary>
@@ -110,6 +117,7 @@ namespace Colosseum.Abnormalities
syncedStunCount.OnValueChanged += HandleSyncedStunChanged;
syncedSilenceCount.OnValueChanged += HandleSyncedSilenceChanged;
syncedInvincibleCount.OnValueChanged += HandleSyncedInvincibleChanged;
syncedSlowMultiplier.OnValueChanged += HandleSyncedSlowChanged;
if (networkController != null)
@@ -128,6 +136,7 @@ namespace Colosseum.Abnormalities
syncedAbnormalities.OnListChanged -= OnSyncedAbnormalitiesChanged;
syncedStunCount.OnValueChanged -= HandleSyncedStunChanged;
syncedSilenceCount.OnValueChanged -= HandleSyncedSilenceChanged;
syncedInvincibleCount.OnValueChanged -= HandleSyncedInvincibleChanged;
syncedSlowMultiplier.OnValueChanged -= HandleSyncedSlowChanged;
if (networkController != null)
@@ -418,6 +427,10 @@ namespace Colosseum.Abnormalities
case ControlType.Slow:
slowMultiplier = Mathf.Min(slowMultiplier, data.slowMultiplier);
break;
case ControlType.Invincible:
invincibleCount++;
break;
}
SyncControlEffects();
@@ -438,6 +451,10 @@ namespace Colosseum.Abnormalities
case ControlType.Slow:
RecalculateSlowMultiplier();
break;
case ControlType.Invincible:
invincibleCount = Mathf.Max(0, invincibleCount - 1);
break;
}
SyncControlEffects();
@@ -460,6 +477,8 @@ namespace Colosseum.Abnormalities
private int GetCurrentSilenceCount() => IsServer ? silenceCount : syncedSilenceCount.Value;
private int GetCurrentInvincibleCount() => IsServer ? invincibleCount : syncedInvincibleCount.Value;
private float GetCurrentSlowMultiplier() => IsServer ? slowMultiplier : syncedSlowMultiplier.Value;
private void SyncControlEffects()
@@ -469,6 +488,7 @@ namespace Colosseum.Abnormalities
syncedStunCount.Value = stunCount;
syncedSilenceCount.Value = silenceCount;
syncedInvincibleCount.Value = invincibleCount;
syncedSlowMultiplier.Value = slowMultiplier;
}
@@ -541,6 +561,14 @@ namespace Colosseum.Abnormalities
OnAbnormalitiesChanged?.Invoke();
}
private void HandleSyncedInvincibleChanged(int oldValue, int newValue)
{
if (oldValue == newValue)
return;
OnAbnormalitiesChanged?.Invoke();
}
/// <summary>
/// 사망 시 활성 이상 상태를 모두 제거합니다.
/// </summary>