Projext/Assets/Scripts/UI/Enemy/EnemyHP Ui.cs
2026-02-13 00:23:25 +09:00

42 lines
2.7 KiB
C#

using UnityEngine; // 유니티 엔진의 기본 기능을 불러올거에요 -> UnityEngine을
using System; // 기본 시스템 기능을 사용할거에요 -> System을
public class EnemyHealth : MonoBehaviour, IDamageable // 클래스를 선언할거에요 -> MonoBehaviour와 IDamageable을 상속받는 EnemyHealth를
{
[Header("--- 능력치 ---")] // 인스펙터 창에 제목을 표시할거에요 -> --- 능력치 --- 를
[SerializeField] private float maxHealth = 50f; // 변수를 선언할거에요 -> 최대 체력(50.0)을 maxHealth에
private float _currentHealth; // 변수를 선언할거에요 -> 현재 체력을 저장할 _currentHealth를
public event Action<float, float> OnHealthChanged; // 이벤트를 선언할거에요 -> 체력 변경 시 현재/최대를 알릴 OnHealthChanged를
public bool IsDead { get; private set; } // 프로퍼티를 선언할거에요 -> 사망 여부를 외부에서 읽기만 가능하게 IsDead에
private void Start() // 함수를 실행할거에요 -> 시작 시 Start를
{
_currentHealth = maxHealth; // 값을 초기화할거에요 -> 현재 체력을 최대 체력으로
// ⭐ 시작하자마자 UI에 현재 숫자가 뜨도록 신호 발송
OnHealthChanged?.Invoke(_currentHealth, maxHealth); // 이벤트를 실행할거에요 -> 초기 체력 상태를 알리기 위해
}
// IDamageable 인터페이스 구현
public void TakeDamage(float amount) // 함수를 선언할거에요 -> 데미지를 입는 TakeDamage를
{
if (IsDead) return; // 조건이 맞으면 중단할거에요 -> 이미 죽었다면
_currentHealth = Mathf.Max(0, _currentHealth - amount); // 값을 계산할거에요 -> 체력에서 데미지를 빼고 0 밑으로 안 내려가게
// ⭐ 피격 시 로그와 함께 UI 갱신 신호 발송
Debug.Log($"{gameObject.name} 피격! 체력: {{{_currentHealth}/{maxHealth}}}"); // 로그를 출력할거에요 -> 피격 정보와 남은 체력을
OnHealthChanged?.Invoke(_currentHealth, maxHealth); // 이벤트를 실행할거에요 -> 변경된 체력 정보를 알리기 위해
if (_currentHealth <= 0) Die(); // 조건이 맞으면 실행할거에요 -> 체력이 0 이하라면 사망 처리 Die를
}
private void Die() // 함수를 선언할거에요 -> 사망 처리를 하는 Die를
{
if (IsDead) return; // 조건이 맞으면 중단할거에요 -> 이미 죽음 처리 중이라면
IsDead = true; // 상태를 바꿀거에요 -> 사망 상태를 참으로
Debug.Log($"{gameObject.name} 사망!"); // 로그를 출력할거에요 -> 사망 메시지를
Destroy(gameObject, 1.5f); // 파괴할거에요 -> 이 오브젝트를 1.5초 뒤에
}
}