센로그
[Unity] UnityEvent (유니티 이벤트) 본문
◆ UnityEvent
게임에서는 콜백이 필요한 경우가 많다.
예를들어 플레이어가 죽으면,
- 죽었다는 문구 출력
- health 초기화
- scene 재시작
이러한 콜백들을 실행하도록 할 수 있다.
Unity 에는 에디터(인스펙터)에서 Callback을 지정할 수 있도록 하는 UnityEvent라는 시스템이 존재한다.
물론 코드로도 지정 가능하다.
< 준비물 >
- Monobehaviour 상속 필요
- using UnityEngine.Events;
+) 유니티 docs : https://docs.unity3d.com/kr/2018.2/Manual/UnityEvents.html
◆ UnityEvent - 에디터 사용
UnityEvent에는 void형 메서드(UnityAction 타입)를 바인딩할 수 있다.
※ UnityAction 타입은 입력 파라미터가 없고 리턴타입을 void로 하는 함수의 델리게이트이다.(정의: public delegate void UnityAction();)
■ 적용
EventsScript에 Hello를 출력하는 void HelloEvent()와, Hi를 출력하는 void HiEvent() 함수가 있다.
이들을 담을 유니티 이벤트인 myEvent를 정의한다.
public class EventsScript : MonoBehaviour
{
public UnityEvent myEvent;
public void HelloEvent()
{
Debug.Log("Hello");
}
public void HiEvent()
{
Debug.Log("Hi");
}
}
다음과 같이 Object의 인스펙터창에서 EventScript 컴포넌트를 추가한다.
+버튼을 누르고, HelloEvent()와 HiEvent()를 myEvent의 콜백으로 넣는다.
이제 myEvent 이벤트를 호출하는 함수 StartMyEvent()를 만든다.
public class EventsScript : MonoBehaviour
{
public void StartMyEvent()
{
myEvent.Invoke();
}
}
위와 같이 UnityEvent.Invoke()를 호출하면 이벤트에 바인딩된 함수들이 호출된다.
만약 위 코드에서 외부에서 StartMyEvent() 함수를 호출한다면, myEvent 이벤트에 연결된 모든 함수들이 호출되는 것이다.
ex)
예를들어 다음과 같이 버튼을 클릭하면 StartMyEvent() 함수를 호출하도록 할 수 있다.
실행 후 RunMyEvent 버튼을 누르면, myEventObject의 myEvent 이벤트에 연결된 모든 함수들이 실행된다.
◆ UnityEvent - 코드 사용
UnityEvent에는 다음 메서드들이 존재한다.
public void AddListener(UnityAction call);
UnityEvent.AddListener(UnityAction)을 하면 UnityAction형 함수가 바인딩된다.
※ UnityAction 타입은 입력 파라미터가 없고 리턴타입을 void로 하는 함수의 델리게이트이다.(정의: public delegate void UnityAction();)
public void Invoke();
UnityEvent.Invoke()를 호출하면 이벤트에 바인딩된 함수들이 호출된다.
public void RemoveListener(UnityAction call);
UnityEvent.RemoveListener(UnityAction)을 하면 UnityAction형 함수가 바인딩 해제된다.
■ 적용
이전과 같은 HelloEvent(), HiEvent()를 코드상에서 myEvent 이벤트에 추가한다고 해보자.
다음과 같이 추가하고 실행할 수 있다.
public class EventsScript : MonoBehaviour
{
public UnityEvent myEvent;
public void Start(){
myEvent.AddListener(HelloEvent);
myEvent.AddListener(HiEvent);
}
public void HelloEvent()
{
Debug.Log("Hello");
}
public void HiEvent()
{
Debug.Log("Hi");
}
public void StartMyEvent()
{
myEvent.Invoke();
}
}
만약 위 코드에서 외부에서 StartMyEvent() 함수를 호출한다면, myEvent 이벤트에 연결된 모든 함수들(HelloEvent(), HiEvent())이 호출되는 것이다.
※ 만약 StartMyEvent()에 AddListener을 넣는다면, StartMyEvent가 호출될 때마다 myEvent에 함수가 하나씩 바인딩된다.
따라서 함수 바인딩 부분과 이벤트 실행 부분을 분리해야 한다.
'게임 > Unity, C#' 카테고리의 다른 글
[C#] Boxing(박싱), UnBoxing(언박싱) (0) | 2023.07.04 |
---|---|
[C#] LINQ (Language Integrated Query) (2) | 2023.07.03 |
[C#] Delegate(대리자) - delegate, Func, Action, Predicate (0) | 2023.07.03 |
[Unity] Scriptable Object (스크립터블 오브젝트) (0) | 2023.06.30 |
[Unity] 유니티 라이프사이클 (0) | 2023.06.30 |