[유니티] 클래스의 다형성, 인터페이스

NOAH·2021년 6월 8일
0

Unity

목록 보기
8/33

인터페이스를 왜 사용할까?

 공격 기능을 추가한다.
 공격받는 물체의 반응 -> 물체마다 다르다.
 물체를 어떻게 구분할 것인가? 

일발적으로 게임 속 플레잉어는 상대방 캐릭터뿐만 아니라 상자나 울타리 같으 다양한 오브젝트를 공격할 수 있다.

게임 속 오브젝트들은 타입에 따라 공격을 받았을 때의 반응이 서로 다르다.

몬스터를 공격하면 몬스터 체력이 깎이고,
상자를 공격하면 상자가 부서지고 아이템이 나온다.

이때 공격에 대한 서로 다른 반응을 구현 하는 가장 나쁜 방법은 공격당한 오브젝트의 타입을 일일히 if문으로 타입을 검사하여 서로 다른 반응을 구현 한다고 해보자.

void OnTriggerEnter(Collider other){

Monster monster = other.GetComponent<Monster>();
if(monster != null)
	{
    monster.method();
	}
    
    
Box box = other.GetComponent<Box>();
	if(box != null)
	{
    	box.method();
	}
}
이런식으로 충돌한 OntriggerEnter에서 충돌한 콜라이더의 타입을 일일히 확인해야 한다. 

세련된 방법은 인터페이스를 사용하는 것이다.

인터페이스를 사용하면 공격당한 다양한 타입의 오브젝트를 하나의 인터페이스로 추상화하여 클래스를 만든다.

public interface IDamageable{
	void hit(GameObject target);
}

// IItem 를 interface는 hit이라는 메소드를 선언만 한다. 

이후, 공격 받을 수 있는 몬스터와 박스 클래스에 IDamageable 인터페이스를 상속받게 해놓고, 인터페이스에 선언되있는 반응(메소드)를 구현한다.

IDamageable 인터페이스를 상속받아 사용해보자.

몬스터의 경우

public class Monster :MonoBehaviour, IDamaeable {
	public int hp = 30;
    
    
    public void hit(GameObject target){
    	hp -= 5;
    	Debug.Log("몬스터가 공격받았습니다. 몬스터 체력 : " + hp); 
    }
}

상자의 경우

public class box :MonoBehaviour, IDamaeable {
	public bool isTouch = true;
    
    public void hit(GameObject target){
    	isTouch = false;
    	Debug.Log("상자가 부숴졌습니다. " ); 
    }
}

0개의 댓글