[유니티 중급]_1 델리게이트(delegate)

0

유니티 엔진

목록 보기
12/21
post-thumbnail

개요

지금까지 'Battle매니저' 클래스에서 'Player' 클래스의 메소드를 호출하기 위해서는 어떻게 하였나요?

'Battle매니저' 클래스 내에서 'Player'를 가지고 있는 게임 오브젝트를 찾아서,
그 오브젝트를 통해서 Player의 메소드를 호출하였습니다.

즉, 'Battle매니저'가 'Player'를 소유하고 있어야 Player의 메소드를 호출할 수 있습니다.
여기에 추가로 '몬스터'도 'Battle매니저'에 추가하여 사용한다고 가정하겠습니다.
코드로 보면 다음과 같습니다.

👇 플레이어 클래스

public class Player : MonoBehavior
{
	public void F1() { ... }
    
}

👇 몬스터 클래스

public class Monster : MonoBehavior
{
	public void F2() { ... }
}

👇 Battle매니저 클래스

public class Battle매니저 : MonoBehavior
{
	public Player p;		//플레이어
    public Monster m;		//몬스터를 클래스에 포함하여야합니다.
    
    private void Start()
    {
    	p = FindObjectOfType<Player>();
        m = FindObjectOfType<Monster>();
    }
    
    public void Call()
    {
    	p.F1();
        m.F2();
    }
}

이렇게 게임 오브젝트의 찾아와서 소유하고 있어야하는 의존적인 관계를
델리게이트를 사용하여 해소할 수 있습니다.

델리게이트 형식

델리게이트는 대리자라는 뜻으로
메소드를 참조하고 있다가 대신 호출해주는 형식(Type)을 의미합니다.
int나 floart같은 형식이기 때문에 인스턴스를 만들어서 사용합니다.

예시에서 보면
사용하면 'Battle매니저'는 델리게이트 인스턴스를 만듭니다.
'플레이어'와 '몬스터'가 내 함수를 호출해줘 하고 'Battle매니저'의 델리게이트에 함수를 등록해둡니다.

'Battle매니저'는 '플레이어'와 '몬스터'를 소유할 필요없이
함수들이 등록된 델리게이트만 실행해주면
두 클래스의 함수들이 모두 실행되는것이 바로 델리게이트입니다.

이렇게 맡기는 함수들을 '콜백(callback)함수'라고 부릅니다.
델리게이트가 이 콜백함수들을 실행하게 합니다.

델리게이트 만들기

델리게이트에 콜백함수를 등록하는 방식이 체인을 만드는 모양새 같다고 해서
델리게이트 하나가 여러 개의 메소드를 동시에 참조하는 것을 델리게이트 체인이라고 부릅니다.

델리게이트 체인을 만들기 위해 '델리게이트'라는 이름으로 스크립트를 하나 만들고
델리게이트 형식을 선언하겠습니다.
다른 클래스에게 노출하기 위해 public으로 설정하겠습니다.

그리고 만들어진 형식으로 델리게이트 인스턴스를 생성합니다.
형식과 마찮가지로 public으로 설정하고
게임 오브젝트를 찾아오는 과정을 줄이기 위해 static으로 설정했습니다.

마지막으로 델리게이트를 원하는 타이밍에 실행할 수 있도록
키보드 W를 눌렀을때 델리게이트의 Invoke() 함수를 동작할 수 있도록 했습니다.
Invoke()는 체인으로 만들어진 델리게이트를 실행하는 함수입니다.

전체 코드

public class 델리게이트 : MonoBehaviour
{
    public delegate void MyDelegate();	//델리게이트 형식 선언
    public static MyDelegate myDel;		//델리게이트 인스턴스 생성

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))	
        {
            myDel.Invoke();				//콜백함수 실행
        }
    }
}

매개변수를 받을 수 있는 델리게이트 만들기

아래 링크에서 {13.3 일반화 대리자}를 참고 해 주시기 바랍니다.
[고급문법 익히기] 13.대리자와 이벤트

델리게이트에 콜백함수 등록하기

이제 '델리게이트' 스크립트가 아닌 다른 스크립트에서 델리게이트에 콜백함수를 등록해볼겁니다.

'구독자'라는 이름으로 스크립트를 하나 만들고
콜백함수로 사용할 함수를 선언했습니다.

그리고 Start 함수에서 static으로 선언한 '델리게이트'클래스의 myDel변수를 가져와서
' += ' 연산자를 통해 콜백함수를 등록합니다.

이렇게 델리게이트를 선언하고 콜백함수를 등록하는 과정까지 진행해봤습니다.
다른 클래스에서도 델리게이트.myDel 변수에 콜백함수를 등록해두면 델리게이트 체인이 만들어집니다.

확인을 위해 유니티 에디터에서 게임을 실행후 W키를 누르면 콜백함수가 잘 동작하는 모습을 볼 수 있습니다.

(또한 델리게이트는 이벤트와 익명메소드를 만들때도 쓰입니다.
델리게이트에 대한 자세한 내용은 아래 링크에서 확인할 수 있습니다.)
[고급문법 익히기] 13.대리자와 이벤트

0개의 댓글