이벤트를 연쇄 동작을 이끌어내는 사건입니다. 이벤트 자체는 어떤 일을 실행하지 않지만 이벤트가 발생하면 이벤트를 구독하는 처리들이 연쇄적으로 실행됩니다.
C#에서 이벤트를 구현하는 대표적인 방법은 델리게이트를 클래스 외부로 공하는 겁니다. 외부로 공개된 델리게이트는 클래스 외부의 메서드가 등록될 수 있는 명단이자 이벤트가 됩니다. 그리고 이벤트가 발동하면 이벤트에 등록된 메서드들이 모두 실행됩니다.
여기서 이벤트들을 듣고 있다가 실행되는 메서드들을 이벤트리스너라고 합니다. 이벤트 리스너를 이벤트에 등록하는 것을 이벤트를 구독한다고 합니다.
델리게이트 타입의 변수는 event 키워드를 붙여 선언할 수 있습니다. 어떤 델리게이트 변수를 event로 선언하면 클래스 외부에서는 해당 델리게이트를 실행할 수 없게 됩니다.
event를 사용하면 이벤트를 소유하지 않는 측에서 멋대로 이벤트를 발동하는 것을 막을 수 있습니다.
- OnEnable()
- LivingEntity의 OnEnable()메서드는 생명체의 상태를 리셋합니다. 사방상태를 flase()로 체력을 시작 체력값으로 초기화합니다. OnEnable()메서드는 LivingEntity가 활성화될 때 실행됩니다.
- OnEnable()은 virtual로 선언된 가상메서드이므로 자식 클래스에서 확장할 수 있습니다. 다만 자식 클래스에서 OnEnable()메서드를 접근 가능해야 확장 가능하므로 접근자를 private가 아닌 protected를 사용했습니다.
- OnDamage()
- 외부에서 LivingEntity()를 공격하는데 사용됩니다.
- 입력으로 받은 Damage만큼 health를 깎습니다. 0보다 작은 경우 Die()를 실행합니다.
- virtual로 선언되었으므로 자식 클래스에서 확장할 수 있습니다.
- RestoreHealth()
- 체력을 회복하는 메서드입니다.
- 죽지 않았다면 입력받은 회복량 newHealth만큼 현재 health를 증가 시킵니다.
- 가상메서드이므로 자식클래스에서 확장할 수 있습니다.
- Die()
- LivingEntity의 죽음을 구현
- onDeath() 이벤트를 발동하여 이벤트에 등록된 메서드를 실행합니다.
LivingEntity 스크립트 전체코드
using System;
using UnityEngine;
// 생명체로서 동작할 게임 오브젝트들을 위한 뼈대를 제공
// 체력, 데미지 받아들이기, 사망 기능, 사망 이벤트를 제공
public class LivingEntity : MonoBehaviour, IDamageable {
public float startingHealth = 100f; // 시작 체력
public float health { get; protected set; } // 현재 체력
public bool dead { get; protected set; } // 사망 상태
public event Action onDeath; // 사망시 발동할 이벤트
// 생명체가 활성화될때 상태를 리셋
protected virtual void OnEnable() {
dead = false; // 사망하지 않은 상태로 시작
health = startingHealth; // 체력을 시작 체력으로 초기화
}
// 데미지를 입는 기능
public virtual void OnDamage(float damage, Vector3 hitPoint,
Vector3 hitNormal) {
// 데미지만큼 체력 감소
health -= damage;
// 체력이 0 이하 && 아직 죽지 않았다면 사망 처리 실행
if (health <= 0 && !dead){
Die();
}
}
// 체력을 회복하는 기능
public virtual void RestoreHealth(float newHealth) {
if (dead){ // 이미 사망한 경우 체력을 회복할 수 없음
return;
}
health += newHealth; // 체력 추가
}
// 사망 처리
public virtual void Die() {
// onDeath 이벤트에 등록된 메서드가 있다면 실행
if (onDeath != null){
onDeath();
}
// 사망 상태를 참으로 변경
dead = true;
}
}
'유니티좀비게임 > 생명과 좀비' 카테고리의 다른 글
좀비 스크립트 (0) | 2023.05.03 |
---|---|
좀비(Enemy) 오브젝트 준비 (0) | 2023.05.03 |
네비게이션 시스템 (0) | 2023.05.03 |
플레이어 체력 UI (0) | 2023.04.30 |
객체지향 다형성 LivingEntity (0) | 2023.04.28 |