이장에서 다루는 내용
- 다형성을 사용해 여러타입을 하나의 타입으로 다루기
- 오버라이드를 사용해 부모 클래스의 기존메서드 확장하기
- 이벤트를 사용해 견고한 커플링을 해소하고 코드를 간결하게 만들기
- UI슬라이더 사용하기
- 게임월드내부에 UI배치하기
- 내비게이션 시스템을 사용해 인공지능 구현하기
- 다형성
- 이장에서는 적 AI와 플레이어 캐릭터를 포함하여 생명체로 동작할 모든 클래스가 공유하는 기반 클래스 LivingEntity를 사용합니다. 생명체로 동작할 모든 클래스는 LivingEntity 클래스를 상속하고 그 위에 자신만의 기능을 추가합니다.
- LivingEntity를 상속한 자식 클래스는 LivingEntity의 구현을 재사용할수 있을 뿐만 아니라 LivingEntyty타입으로 취급될 수 있습니다. 따라서 LivingEntity를 상속한 다양한 타입의 게임속 생명체를 LivingEntity 타입으로 일괄 처리 할 수 있습니다.
- 이것은 다형성이라는 객체지향의 특징 덕분입니다. LivingEntity 클래스를 사용하기 전에 상속을 이해하고 다형성이 무엇인지 살펴보겠습니다. 그리고 다형성이 코드를 쉽고 간결하게 만드는 데 어떻게 도움을 주는지 알아보겠습니다.
- 상속관계에서의 다형성
- 다형성을 문자 그대로 해석하면 여러형태입니다. c#에서 다형성은 자식 클래스 타입을 부모클래스 타입으로 다룰 수 있게 합니다.
- 상속이란 부모클래스를 기반으로 자식클래스를 만드는 방법입니다. 이것은 현실에서 어떤 물체를 더 포괄적인 분류로 다루는 것에 비유할 수 있습니다. 예를 들어 동물이나 식물은 더 포괄적인 분류인 생명체로 다룰 수 있습니다.
- class Monster{ public void Attack(); public float damage=100f;}라는 클래스가 있습니다.
- class Orc : Monster { public void Cry()}, Monster를 상속받는 자식 클라스를 만들었습니다.
- Orc orc; Monster monster = orc; 로 orc객체를 monster에 할당합니다. 변형이 아닙니다.
- monster.Attack()는 문제 없지만 monster.Cry()는 에러입니다. monster클래스에는 Cry()가 없기 때문입니다.
- 다형성을 사용한 패턴
- class Dragon:Monster {public void Fly();}는 다른 자식클래스를 만듭니다.
- 게임중 Dragon과 Orc의 객체를 많이 만듭니다.
- Monster[] monsters = findObjectsOfType<Monsters>();
- for(int i = 0;i<Monsters.Length;i++) monsters[i].damage += 10f;
- 위와 같이 <Monster>로Dragon과 Orc객체들의 damage를 갱신할 수 있습니다.
- 오버라이드
- 부모클래스에서 정의된 메서드를 자식클래스에서 재정의하는 걸 오버라이드라고 합니다.
- Orc와 Dragon의 Attack()기술이 다를 경우 활용할수 있습니다.
- class Monster{ public virtual void Attack(){Debug.Log("공격");}}이라고 할때
- class Orc : Monster {public override void Attack() {base.Attack; 추가처리;} }오버라이드할 수 있습니다
- virtual 키워드로 지정된 메서드는 가상 메서드가 됩니다. 가상 메서드는 자식 클래스가 오버라이드 할 수 있도록 허용된 메서드 입니다. 자식 클래스는 override 키워드를 사용해 부모 클래스의 가상 메서드를 재정의 할 수 있습니다. 자식 객체가 연결된 부모 참조의 오버라이드된 메서드는 자식 메서드가 실행됩니다.
- Orc orc; Monster monster = orc; monster.Attack(); <- Orc에서 재정의된 Attack()가 실행
- virtual로 지정된 메서드는 가상메서드가 됩니다. 자식클래스에서override를 허용해줍니다.
- base를 사용해 부모의 원형 메서드로 접근할 수 있습니다.
- class Dragon : Monster {public override void Attack() { base.Attack(); Debug.Log("추가"); } }
- 오버라이드 활용 : 다양한 자식 클래스의 같은 이름의 메서드를 실행하되 실제 처리는 각자 다르게 만들수 있습니다.
- for(int i = 0;i<Monsters.Length;i++) monsters[i].Attack();
- LivingEntity기반 클래스
- 체력, 피해, 사망기능,사망이벤트 제공
- LivingEntity 클래스는 IDamageable을 상속하므로 OnDamage()메서드를 반드시 구현해야 합니다.
- LivingEntity의 필드
- startingHealth // 시작 체력
- health { get; protected set; } // 현재 체력
- public bool dead { get; protected set; } // 사망 상태
- public event Action onDeath; // 사망시 발동할 이벤트
- Action
- Action 타입은 입력과 출력이 없는 메서드를 가리킬 수 있는 델리게이트입니다. 델리게이트는 대리자로 번역되며 메서드를 값으로 할당받을 수 있는 타입입니다.
- Action으로 지정된 객체는 +=를 이용해 메서드를 등록할 수 있습니다. 괄호없이 이름만 명시하면 됩니다. action += Func1(); action += Func2();
- 괄호를 붙이면 실행후 결과값이 들어가므로 에러입니다.
- Action 변수()를 실행하면 등록된 메서드들이 일괄 실행 됩니다.
public class Cleaner : MonoBehaviour {
Action OnClean;
void Start() {
onClean += CleaningRoomA; // += 로 메스드 등록
onClean += CleaningRoomB;
}
void Update() {
if (Input.GetMouseButtonDown(0)) {
onClean(); // CleaningRoomA()와 CleaningRoomB() 실행
}
}
void CleaningRoomA() {
Debug.Log("A방 청소");
}
void CleaningRoomA() {
Debug.Log("A방 청소");
}
}
'유니티좀비게임 > 생명과 좀비' 카테고리의 다른 글
좀비 스크립트 (0) | 2023.05.03 |
---|---|
좀비(Enemy) 오브젝트 준비 (0) | 2023.05.03 |
네비게이션 시스템 (0) | 2023.05.03 |
플레이어 체력 UI (0) | 2023.04.30 |
Event (0) | 2023.04.28 |