240214-TIL

2024. 2. 14. 21:16내일배움캠프

2월 14일

 

오늘은 예전 New Input System을 다뤘을때

 

구독시스템에 대해 이해를 못해 한참을 유니티에 벽을 느끼던걸 다시 한번 정리해야겠다.

 

왜 그렇게도 어려웠을까? 아마 지금부터 정리할 내용을 통째로 건너뛰고

 

그저 구독 시스템을 이해하려고 했기 때문이었을 것이다.

Delegate

더보기

델리게이트라고 하는 녀석이다.

 

비슷한 개념으로는 C/C++의 함수 포인터같은 녀석이라고 한다.

 

사실 백날 설명해봐야 한번 예제 코드를 보고 그걸 뜯어보면서 이해하는게 빠르다

 

// 델리게이트 선언
delegate void MyDelegate();

// 메서드 정의
void Method1()
{
    Debug.Log("Method 1 called");
}

void Method2()
{
    Debug.Log("Method 2 called");
}

// 델리게이트 변수 생성 및 메서드 할당
MyDelegate myDelegate = Method1;
myDelegate(); // Method1 호출
myDelegate = Method2;
myDelegate(); // Method2 호출

 

delegate void MyDelegate() 라고 하는 델리게이트를 선언해준다.

 

델리게이트는 delegate 키워드를 사용하여 선언되는데

 

이곳에는 함수를 담아서 사용할 수 있다.

 

그냥 int a; 에 정수를 담아 사용하는 느낌이라고 해야하려나?

 

MyDlegate myDelegate = Method1;  선언한 델리게이트로 변수를 생성해준다 그리고 메서드를 할당해준다

 

Metho1;을 할당했으니 이제 나는 myDelegate로 Method1의 기능을 사용할 수 있다. 

 

참 쉽다. 델리게이트는 이게 끝이다

 

델리게이트를 알아보았으니 이제 이 델리게이트를 이용한 이벤트 처리 예제를 보자.

 

이벤트는 델리게이트를 통해 다른 객체에게 상황을 알리는 역할을 한다.

 

이벤트는 클래스 내에서 델리게이트를 이용하여 선언되고 클래스 외부에서는 

 

이벤트에 대한 구독 및 해지만 가능하다.

 

이벤트를 어쩔때 쓰려나? 바로 특정 상황이나 조건이 발생할때 다른 객체에게 통지,알림을 보내는 데 사용한다.

 

예제를 보자

 

// 유니티에서의 이벤트 처리 예제
public class Player : MonoBehaviour
{
    public delegate void PlayerEventHandler();
    public static event PlayerEventHandler OnPlayerDeath;

    void Die()
    {
        if (OnPlayerDeath != null)
            OnPlayerDeath();
    }
}

public class GameManager : MonoBehaviour
{
    void Start()
    {
        Player.OnPlayerDeath += HandlePlayerDeath;
    }

    void HandlePlayerDeath()
    {
        Debug.Log("Player died!");
    }
}

 

게임으로 이해하는게 훨씬 빨리 이해하는것 같아서 이 예제를 가져왔다.

 

플레이어가 죽었을때 어디사는 누군가는 이 플레이어가 죽었다는 알림을 받고 처리해야할 로직이 있을것이다.

 

 

여기서 이벤트를 만들어준다 OnPlayerDeath

 

 

플레이어가 죽었을때? 이벤트를 실행시켜 이벤트에 구독되어있는 대상에게 알림을 보내준다

 

 

 

여기가 어디사는 누군가인 GameManager씨 Player가 죽기만을 오매불망 기다리고 있다.

 

Start() 부분에서 Player가 죽으면 죽었다고 알려주는 좋은 쁘락치가 있다하여 쁘락치에게

 

플레이어가 죽으면 알려달라 조용히 구독을 했다.

 

플레이어가 죽으면 실행시킬 일이 있다면서 말이다. 그 일이 바로 HandlePlayerDeath()

 

플레이어가 죽었다는 쁘락치의 정보에 의해 어디사는 누군가인 GameManager씨는 조용히

 

HandlePlayerDeath()를 실행시킬 것이다.

 

대충 이런 느낌이다.

 

 

 

오늘은 Delegate에 대해서 그리고 Delegate를 활용한 이벤트 예제까지 정리해보았다.

 

항상 반쯤 이해한 상태에서 사용해왔던 이벤트였는데 오늘 예제와 함께 머릿속에서 사라지지 않던 물음표를

 

정리할 수 있을것 같다.

 

2월 14일 TIL은 여기서 마치도록 하겠다.

'내일배움캠프' 카테고리의 다른 글

240216-TIL  (0) 2024.02.16
240215-TIL  (0) 2024.02.15
240213-TIL  (0) 2024.02.13
240208-TIL  (0) 2024.02.08
240207-TIL  (0) 2024.02.07