플레이어 체력 자연 회복 기능 추가

전투 상태 감지 기능
player stat으로 관리 가능
This commit is contained in:
2026-02-25 21:09:19 +09:00
parent a27a59d176
commit d066290607
4 changed files with 107 additions and 2 deletions

View File

@@ -54,6 +54,10 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
private UnitHealthBar _healthBar;
private RespawnCountdownUI _respawnCountdownUI;
// 체력 자연 회복
private float _lastCombatTime;
private float _hpRegenAccumulator;
// 이 플레이어가 로컬 플레이어인지 확인
@@ -163,6 +167,12 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
void Update()
{
// 서버에서 체력 자연 회복 처리
if (IsServer)
{
UpdateHealthRegeneration();
}
// 로컬 플레이어만 입력 처리
if (!IsLocalPlayer) return;
@@ -257,6 +267,9 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
int actualDamage = Mathf.Min(damage, _currentHealth.Value);
_currentHealth.Value -= actualDamage;
// 전투 상태 기록 (회복 방지)
MarkInCombat();
// 데미지 이펙트
ShowDamageEffectClientRpc();
@@ -478,6 +491,62 @@ public class NetworkPlayerController : NetworkBehaviour, ITeamMember, IDamageabl
public int GetCurrentHealth() => _currentHealth.Value;
/// <summary>
/// 전투 상태 기록 (데미지를 받거나 입힐 때 호출)
/// </summary>
public void MarkInCombat()
{
_lastCombatTime = Time.time;
}
/// <summary>
/// 현재 전투 중인지 확인 (회복 대기 시간이 지났는지)
/// </summary>
public bool IsInCombat()
{
if (_playerStats == null) return false;
float regenDelay = _playerStats.GetHpRegenDelay();
return (Time.time - _lastCombatTime) < regenDelay;
}
/// <summary>
/// 서버에서 체력 자연 회복 처리
/// </summary>
private void UpdateHealthRegeneration()
{
// 죽었으면 회복하지 않음
if (_currentHealth.Value <= 0) return;
// 이미 최대 체력이면 회복하지 않음
int maxHealth = GetMaxHealth();
if (_currentHealth.Value >= maxHealth)
{
_hpRegenAccumulator = 0f;
return;
}
// 전투 중이면 회복하지 않음
if (IsInCombat()) return;
// 회복량 계산
float hpRegen = _playerStats?.GetHpRegen() ?? 0f;
if (hpRegen <= 0f) return;
// 프레임당 회복량 누적
_hpRegenAccumulator += hpRegen * Time.deltaTime;
// 1 이상 누적되면 정수만큼 회복
if (_hpRegenAccumulator >= 1f)
{
int healAmount = Mathf.FloorToInt(_hpRegenAccumulator);
_hpRegenAccumulator -= healAmount;
// 실제 회복
int actualHeal = Mathf.Min(healAmount, maxHealth - _currentHealth.Value);
_currentHealth.Value += actualHeal;
}
}
public int GetMaxHealth() => _playerStats?.GetMaxHp() ?? 100;
public float GetHealthPercentage()