42 lines
2.7 KiB
C#
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초 뒤에
|
|
}
|
|
} |