플레이어 체력 자연 회복 기능 추가
전투 상태 감지 기능 player stat으로 관리 가능
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user