feat: 빈사/부활 시스템 및 ReviveEffect 추가

- PlayerNetworkController에 Revive(healthPercent) 메서드와 OnRevived 이벤트 추가

- ReviveEffect 스킬 이펙트 구현 (Area/Ally 타겟팅, healthPercent로 체력 복구)

- GameManager가 OnRevived 구독하여 alivePlayers 동적 복구

- GameManager.Update에서 나중에 스폰된 플레이어 자동 구독 (MPP 대응)

- SkillCancelReason에 Revive 추가

- 부활 스킬/이펙트 ScriptableObject 에셋 생성 (치유 클립 임시 사용)

- PlayerSkillDebugMenu에 즉사/부활/리스폰/스폰/Client1 스킬 디버그 메뉴 추가

- PlayerAbnormalityDebugHUD에 부활 버튼 추가

- DebugExecuteSkillAsServer에 실패 원인 로그 추가

- AGENTS.md에 코드 변경 후 force reload 규칙 추가
This commit is contained in:
2026-03-28 21:03:28 +09:00
parent 057b17e6cc
commit 282e4b29c4
12 changed files with 385 additions and 9 deletions

View File

@@ -83,6 +83,7 @@ namespace Colosseum.Player
public event Action<PlayerNetworkController> OnDeath;
public event Action<bool> OnDeathStateChanged;
public event Action<PlayerNetworkController> OnRespawned;
public event Action<PlayerNetworkController> OnRevived;
public event Action OnPassiveSelectionChanged;
public float CurrentHealth => currentHealth.Value;
@@ -249,7 +250,8 @@ namespace Colosseum.Player
}
/// <summary>
/// 사망 처리 (서버에서만 실행)
/// 사망(빈사) 처리 (서버에서만 실행).
/// HP가 0 이하가 되면 호출되며, 부활 스킬로 복귀 가능한 빈사 상태로 전환합니다.
/// </summary>
private void HandleDeath()
{
@@ -362,6 +364,36 @@ namespace Colosseum.Player
Debug.Log($"[Player] Player {OwnerClientId} respawned!");
}
/// <summary>
/// 빈사 상태에서 부활 (서버에서만 실행)
/// </summary>
/// <param name="healthPercent">부활 시 체력 비율 (0~1)</param>
public void Revive(float healthPercent = 0.3f)
{
if (!IsServer || !isDead.Value)
return;
isDead.Value = false;
float revivedHealth = Mathf.Max(1f, MaxHealth * Mathf.Clamp01(healthPercent));
currentHealth.Value = revivedHealth;
PlayerMovement movement = GetComponent<PlayerMovement>();
if (movement != null)
{
movement.enabled = true;
}
PlayerSkillInput skillInput = GetComponent<PlayerSkillInput>();
if (skillInput != null)
{
skillInput.enabled = true;
}
OnRevived?.Invoke(this);
Debug.Log($"[Player] Player {OwnerClientId} revived! HP={revivedHealth:F0}");
}
/// <summary>
/// 서버 기준으로 패시브 프리셋을 적용합니다.
/// </summary>