이장에서 다루는 내용

  • 다형성을 사용해 여러타입을 하나의 타입으로 다루기
  • 오버라이드를 사용해 부모 클래스의 기존메서드 확장하기
  • 이벤트를 사용해 견고한 커플링을 해소하고 코드를 간결하게 만들기
  • UI슬라이더 사용하기
  • 게임월드내부에 UI배치하기
  • 내비게이션 시스템을 사용해 인공지능 구현하기
  1. 다형성
    • 이장에서는 적 AI와 플레이어 캐릭터를 포함하여 생명체로 동작할 모든 클래스가 공유하는 기반 클래스 LivingEntity를 사용합니다. 생명체로 동작할 모든 클래스는 LivingEntity 클래스를 상속하고 그 위에 자신만의 기능을 추가합니다.
    • LivingEntity를 상속한 자식 클래스는 LivingEntity의 구현을 재사용할수 있을 뿐만 아니라 LivingEntyty타입으로 취급될 수 있습니다. 따라서 LivingEntity를 상속한 다양한 타입의 게임속 생명체를 LivingEntity 타입으로 일괄 처리 할 수 있습니다.
    • 이것은 다형성이라는 객체지향의 특징 덕분입니다. LivingEntity 클래스를 사용하기 전에 상속을 이해하고 다형성이 무엇인지 살펴보겠습니다. 그리고 다형성이 코드를 쉽고 간결하게 만드는 데 어떻게 도움을 주는지 알아보겠습니다.
  2. 상속관계에서의 다형성
    • 다형성을 문자 그대로 해석하면 여러형태입니다. 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를 갱신할 수 있습니다.
  3. 오버라이드
    • 부모클래스에서 정의된 메서드를 자식클래스에서 재정의하는 걸 오버라이드라고 합니다.
    • Orc와 Dragon의 Attack()기술이 다를 경우 활용할수 있습니다.
    • class Monster{ public virtual void Attack(){Debug.Log("공격");}}이라고 할때
    • class Orc : Monster {public override void Attack() {base.Attack; 추가처리;} }오버라이드할 수 있습니다
      1. virtual 키워드로 지정된 메서드는 가상 메서드가 됩니다. 가상 메서드는 자식 클래스가 오버라이드 할 수 있도록 허용된 메서드 입니다. 자식 클래스는 override 키워드를 사용해 부모 클래스의 가상 메서드를 재정의 할 수 있습니다. 자식 객체가 연결된 부모 참조의 오버라이드된 메서드는 자식 메서드가 실행됩니다.
      2. Orc orc; Monster monster = orc; monster.Attack();  <- Orc에서 재정의된 Attack()가 실행
    • virtual로 지정된 메서드는 가상메서드가 됩니다. 자식클래스에서override를 허용해줍니다.
    • base를 사용해 부모의 원형 메서드로 접근할 수 있습니다.
    • class Dragon : Monster {public override void Attack() { base.Attack(); Debug.Log("추가"); } }
  4. 오버라이드 활용 : 다양한 자식 클래스의 같은 이름의 메서드를 실행하되 실제 처리는 각자 다르게 만들수 있습니다.
    • for(int i = 0;i<Monsters.Length;i++) monsters[i].Attack();
  5. LivingEntity기반 클래스
    • 체력, 피해, 사망기능,사망이벤트 제공
    • LivingEntity 클래스는 IDamageable을 상속하므로 OnDamage()메서드를 반드시 구현해야 합니다.
    • LivingEntity의 필드
      • startingHealth // 시작 체력
      • health { get; protected set; } // 현재 체력
      • public bool dead { get; protected set; } // 사망 상태
      • public event Action onDeath; // 사망시 발동할 이벤트
  6. Action
    1. Action 타입은 입력과 출력이 없는 메서드를 가리킬 수 있는 델리게이트입니다. 델리게이트는 대리자로 번역되며 메서드를 값으로 할당받을 수 있는 타입입니다.
    2. Action으로 지정된 객체는 +=를 이용해 메서드를 등록할 수 있습니다. 괄호없이 이름만 명시하면 됩니다. action += Func1(); action += Func2();
    3. 괄호를 붙이면 실행후 결과값이 들어가므로 에러입니다.
    4. Action 변수()를 실행하면 등록된 메서드들이 일괄 실행 됩니다.
    5.  
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

+ Recent posts