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 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초 뒤에 } }