이벤트 호출 방법으로 UnityEvent, Action, 직접 delegate로 만든 event 등등 여러가지가 있다. 그렇다면 이벤트에 등록된 함수들은 언제 호출 될까 궁금했다. 같은 프레임에서 호출될까? 아니면 몇 프레임이 지난 뒤에 호출 될까? 그래서 테스트해보기로 했다.
이벤트를 호출하는 스크립트이다.
using System;
using UnityEngine;
using UnityEngine.Events;
public class EventFrameTest : MonoBehaviour
{
float frameNum = 0f;
public UnityEvent spaceBarEvent;
public Action action;
public delegate void CustomEventHandler();
public event CustomEventHandler customEvent;
void Update()
{
frameNum++;
if (Input.GetKeyDown(KeyCode.Space))
{
string debugMessage = "<color=cyan>Call Space Bar Event!</color>";
Debug.Log(debugMessage);
spaceBarEvent?.Invoke();
}
if (Input.GetKeyDown(KeyCode.A))
{
string debugMessage = "<color=cyan>Call Action Event!</color>";
Debug.Log(debugMessage);
action?.Invoke();
}
if (Input.GetKeyDown(KeyCode.C))
{
string debugMessage = "<color=cyan>Call CustomEvent!</color>";
Debug.Log(debugMessage);
customEvent?.Invoke();
}
Debug.Log(frameNum);
}
}
매프레임 체크를 위해 frameNum 변수가 Debug.log로 프레임 숫자를 로깅하고 있다. 그리고 Spacebar, A, C 각각 다른 방법으로 이벤트를 호출한다. 순서대로, UnityEvent, Action, event 이다.
다음은 해당 이벤트 호출자를 listen하는 스크립트이다.
using UnityEngine;
public class EventSubscriber : MonoBehaviour
{
[SerializeField] private EventFrameTest eventCaller;
void Start()
{
eventCaller.spaceBarEvent.AddListener(() =>
{
Debug.Log("<color=orange>" + this.gameObject.name + " is Listening!" + "</color>");
});
eventCaller.action += () =>
{
Debug.Log("<color=orange>" + this.gameObject.name + " is Listening!" + "</color>");
};
eventCaller.customEvent += () =>
{
Debug.Log("<color=orange>" + this.gameObject.name + " is Listening!" + "</color>");
};
}
}
위에 말한 3가지 이벤트에 다 Debug.Log("<color=orange>" + this.gameObject.name + " is Listening!" + "</color>"); 를 하는 함수를 등록했다.
위에 3개의 스크린샷이 각각의 결과다. 세가지 방법 모두 listen되어있는 함수들이 같은 프레임에서 호출된것을 알 수 있다. (파란색 호출 Debug 이후로 노란색 Listen된 함수들의 Debug가 연속되어 나온다)
'Unity & C#' 카테고리의 다른 글
[유니티] 스크립트 아이콘 변경 (0) | 2022.07.24 |
---|---|
[유니티] 클립보드 복사 기능 구현하기 (0) | 2022.07.22 |
[c#] Obsolete 활용하기 (0) | 2022.07.14 |
[유니티] Frame Debugger 사용하기 (0) | 2022.07.12 |
[유니티] Unity에 Nuget Package Import 하기 (0) | 2022.07.09 |