Unity는 표준 C# 이벤트 및 델리게이트에 대한 Unity 전용 대안으로 UnityEvent API를 제공합니다. 일반 C# 이벤트와 비교했을 때 Unity 이벤트의 주요 이점은 Unity 이벤트는 직렬화 가능하다는 점입니다. 즉, 인스펙터 창에서 설정할 수 있습니다.
UnityEvent는 모든 MonoBehaviour에 추가할 수 있으며 표준 C# 델리게이트처럼 런타임 시 실행됩니다. MonoBehaviour에서 UnityEvent가 선언되면 편집 시간과 런타임 사이에 유지되는 콜백을 정의할 수 있는 인스펙터 창에 표시됩니다.
Unity 이벤트에는 표준 C# 델리게이트와 유사한 제한이 있습니다.
UnityEngine.Object가 타겟으로 있고 관리되지 않는 (C++) 상대 오브젝트가 삭제된 경우 콜백이 호출되지 않습니다. 자세한 내용은 Null 레퍼런스를 참조하십시오.using UnityEngine.Events를 포함하는 MonoBehaviour 스크립트 생성UnityEvent 유형의 필드를 하나 이상 선언선언된 UnityEvent 필드가 포함된 스크립트 컴포넌트가 있는 게임 오브젝트를 선택합니다.
이벤트 이름 아래의 + 버튼을 클릭하여 콜백의 슬롯을 추가합니다.
콜백을 수신할 UnityEngine.Object를 선택합니다. 오브젝트 선택기를 사용하거나 오브젝트를 필드로 드래그 앤 드롭해도 됩니다.
이벤트가 발생할 때 호출될 함수를 선택합니다. 드롭다운 선택기는 게임 오브젝트와 해당 컴포넌트에서 사용할 수 있는 적절한 메서드의 필터링된 리스트로 채워집니다.
필요에 따라 1–4단계를 반복하여 동일한 이벤트에 콜백을 추가합니다.
UnityEvent를 인스펙터 창에서 설정하는 경우 두 가지 유형의 함수 호출이 지원됩니다.
UnityEvent 유형과 일치하는 파라미터로 코드에서 프로그래밍 방식으로 호출됩니다. 이는 런타임 시점에 달라지는 값에 적합합니다. 예를 들어 캐릭터가 각 공격에서 입은 손상의 변수를 나타내는 float입니다. UI에는 콜백을 필터링하고, 해당 UnityEvent 유형에 유효한 서명이 있는 동적 함수만 표시됩니다. 예를 들어 UnityEvent<string>가 있는 경우 함수 선택자에는 Dynamic string 헤더 아래에 string 파라미터를 허용하는 모든 함수가 나열됩니다.
기본적으로 Monobehaviour의 UnityEvent는 void 함수에 동적으로 바인딩됩니다. 그러나 다음 예시와 같이 최대 4개의 일반 유형 파라미터로 UnityEvent를 생성할 수 있습니다.
using UnityEngine;
using UnityEngine.Events;
public class GenericTest : MonoBehaviour
{
public UnityEvent<int, int, bool, string> myEvent;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
if (myEvent == null)
{
myEvent = new UnityEvent<int, int, bool, string>();
}
myEvent.AddListener(Ping);
}
// Update is called once per frame
void Update()
{
if (Input.anyKeyDown && myEvent != null)
{
myEvent.Invoke(5, 6, true, "Hello");
}
}
void Ping(int i, int j, bool print, string text)
{
if (print)
{
Debug.Log("Ping: " + text + i + j);
}
}
}