Unity & C#

[유니티 c#] event에 등록된 함수들은 언제 불릴까?

왼손잡이개발자 2022. 7. 15. 13:00

이벤트 호출 방법으로 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>"); 를 하는 함수를 등록했다. 

 

순서로 UnityEvent, Action, event 호출

위에 3개의 스크린샷이 각각의 결과다. 세가지 방법 모두 listen되어있는 함수들이 같은 프레임에서 호출된것을 알 수 있다. (파란색 호출 Debug 이후로 노란색 Listen된 함수들의 Debug가 연속되어 나온다)