유니티 인터페이스 사용하기

phoenixKim·2021년 3월 28일
1

유니티_꿀팁

목록 보기
10/17
  • 인터페이스를 사용해야 하는 이유
    : 실제형식에 관계없이 부모형식을 통해서 접근이 가능하므로
    코드 간편화가 가능하다.
    컴파일러가 알아서 해당 클래스내의 함수를 찾는다.
    (내 생각에는 내부적으로 상향형변환 접근이 가능한 상태이고 + virtual 이 되어있는 상태여서 이러한 접근이 가능한 것이 아닌가라고 생각을 하고 계속해서 공부해서 개념을 확실히 하자!)
    내가 이렇게 생각한 이유는!
    만약에 virtual이 안되어 있다면 참조형식인 부모쪽의 함수가 호출되기 때문이다.

예를 들어서
1) hp를 회복시키는 아이템과
2) mp를 회복시키는 아이템이 있다.
근데 클래스를 구분지어서 만들었다.

인터페이스 기능없이 구현

class Hp
{
    private int hpUP = 50;
    void Use()
    {
    	Player player = FindObjectOfType<Player>();
        player.hp += hpUP;
    	유저클래스 찾아서 접근
        유저 객체로 받아서 hp 증가하는 코드        
    }
}

class Mp
{
    private int mpUP = 50;
    void Use()
    {
    	Player player = FindObjectOfType<Player>();
  	player.mp += mpUP;
    	유저클래스 찾아서 접근
        유저 객체로 받아서 mp 증가하는 코드        
    }
}

//유저 입장 => 아래의 코드처럼 지금은 두개지만 아이템 확장될수록 
//번잡해질 가능성이 높아진다. 이럴때 인터페이스 기능을 이용하면 
//코드를 축소할 수 있다.

void OnTrigger2d(other)
{
    Mp mp = other.GetComponent<Mp>();
    if(mp != null)
    {
    	mp.Use();
    }
    
    Hp hp = other.GetComponent<Hp>();
    if(hp != null)
    {
    	hp.Use();
    }
}

인터페이스 사용 구현

public interface IItem
{
    void Use();

}

//인터페이스 클래스를 상속함.
//인터페이스 클래스를 상속하면 반드시 재정의를 해야한다.
//안하면 컴파일러 에러 발생 + 그냥 빨간 밑줄 생긴다.
class Hp : IItem
{
    private int hpUP = 50;
    void Use()
    {
       Player player = FindObjectOfType<Player>();
       player.hp += hpUP;
    	유저클래스 찾아서 접근
        유저 객체로 받아서 hp 증가하는 코드        
    }
}

class Mp : IItem
{
    private int mpUP = 50;
    void Use()
    {
    	Player player = FindObjectOfType<Player>();
  	player.mp += mpUP;
    	유저클래스 찾아서 접근
        유저 객체로 받아서 mp 증가하는 코드        
    }
}

//유저 입장의 코드
//인터페이스를 이용해 코드 간편화가 가능하다.
//형식에 관계없이 컴파일러가 알아서 해당클래스내의 함수를 호출한다.
//인터페이스 상속받은 하위클래스는 무조건 인터페이스의 함수를 
//재정의해야 하므로

void OnTrigger2d(other)
{
    IItem item = other.GetComponent<IItem>();
    if(item != null)
    {
    	//알아서 찾아간다.
    	item.Use();
    }
}

profile
🔥🔥🔥

0개의 댓글