Projext/Assets/5.TestScript/Health.cs

81 lines
2.6 KiB
C#
Raw Normal View History

2026-01-29 06:58:38 +00:00
using UnityEngine;
using System;
public class PlayerHealth : MonoBehaviour, IDamageable
{
[SerializeField] private Stats stats;
[SerializeField] private Animator animator;
2026-01-29 06:58:38 +00:00
public bool IsDead { get; private set; }
public bool isHit { get; private set; }
2026-01-29 06:58:38 +00:00
public event Action OnHit, OnDead;
public event Action<float, float> OnHealthChanged;
private float _currentHealth;
private void Start()
{
if (stats != null)
{
_currentHealth = stats.MaxHealth;
OnHealthChanged?.Invoke(_currentHealth, stats.MaxHealth);
}
if (animator == null) animator = GetComponent<Animator>();
}
// ⭐ [최종 수정] 최대 체력 변동 시 호출: 피는 안 채우되, 그릇(MaxHealth)을 넘치는 피는 깎습니다.
public void RefreshHealthUI()
{
if (stats != null)
{
// 1. [핵심] 현재 체력이 최대 체력을 넘지 못하도록 고정 (Clamp)
// 최대 체력이 늘어나면 기존 피 유지, 줄어들어서 피가 넘치면 최대치로 깎음
_currentHealth = Mathf.Min(_currentHealth, stats.MaxHealth);
// 2. 즉시 UI에 바뀐 수치를 보냅니다.
if (OnHealthChanged != null)
{
OnHealthChanged.Invoke(_currentHealth, stats.MaxHealth);
Debug.Log($"[Health Sync] UI 갱신 완료: {_currentHealth} / {stats.MaxHealth}");
}
}
}
// ... (TakeDamage 등 나머지 기존 코드 유지)
2026-01-29 06:58:38 +00:00
public void TakeDamage(float amount)
{
if (IsDead) return;
_currentHealth = Mathf.Max(0, _currentHealth - amount);
OnHealthChanged?.Invoke(_currentHealth, stats.MaxHealth);
OnHit?.Invoke();
if (!IsDead) StartHit();
if (_currentHealth <= 0) Die();
}
private void StartHit()
{
isHit = true;
if (animator != null) animator.Play("HitAnime", 0, 0f);
2026-01-29 06:58:38 +00:00
CancelInvoke(nameof(OnHitEnd));
Invoke(nameof(OnHitEnd), 0.05f);
}
public void OnHitEnd() { isHit = false; }
2026-01-29 06:58:38 +00:00
private void Die()
{
IsDead = true;
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
OnDead?.Invoke();
}
public void Heal(float amount)
{
if (IsDead) return;
// 현재 체력에 회복량을 더하되, Stats의 MaxHealth를 넘지 못하게 합니다.
_currentHealth = Mathf.Min(_currentHealth + amount, stats.MaxHealth);
// UI 갱신
OnHealthChanged?.Invoke(_currentHealth, stats.MaxHealth);
}
2026-01-29 06:58:38 +00:00
}