인스펙터에서 설정할 수 있는 커스텀 이벤트
Create your own custom events to configure persistent (lasting between Edit mode and Play mode) callbacks in the Inspector window.
읽는 시간 2분최근 업데이트: 한 달 전
Unity는 표준 C# 이벤트 및 델리게이트에 대한 Unity 전용 대안으로 UnityEvent API를 제공합니다. 일반 C# 이벤트와 비교했을 때 Unity 이벤트의 주요 이점은 Unity 이벤트는 직렬화 가능하다는 점입니다. 즉, 인스펙터 창에서 설정할 수 있습니다.
UnityEventMonoBehaviourMonoBehaviourUnityEventUnity 이벤트에는 표준 C# 델리게이트와 유사한 제한이 있습니다.
- 타겟 오브젝트에 대한 레퍼런스를 유지하여 타겟 오브젝트가 가비지 컬렉션이 되는 것을 막습니다.
- 관리되는 (C#) 가 타겟으로 있고 관리되지 않는 (C++) 상대 오브젝트가 삭제된 경우 콜백이 호출되지 않습니다. 자세한 내용은 Null 레퍼런스를 참조하십시오.
UnityEngine.Object
Unity 이벤트 설정
선행 조건
- 를 포함하는 MonoBehaviour 스크립트 생성
using UnityEngine.Events - 유형의 필드를 하나 이상 선언
UnityEvent
인스펙터 창에서 콜백 설정:
-
선언된필드가 포함된 스크립트 컴포넌트가 있는 게임 오브젝트를 선택합니다.
UnityEvent -
이벤트 이름 아래의 + 버튼을 클릭하여 콜백의 슬롯을 추가합니다.
-
콜백을 수신할 UnityEngine.Object를 선택합니다. 오브젝트 선택기를 사용하거나 오브젝트를 필드로 드래그 앤 드롭해도 됩니다.
-
이벤트가 발생할 때 호출될 함수를 선택합니다. 드롭다운 선택기는 게임 오브젝트와 해당 컴포넌트에서 사용할 수 있는 적절한 메서드의 필터링된 리스트로 채워집니다.
-
필요에 따라 1-4단계를 반복하여 동일한 이벤트에 콜백을 추가합니다.
인스펙터 창에서 Trigger Entered 및 Trigger Exited라는 이벤트에 대한 콜백 설정
정적 및 동적 호출
UnityEvent- 정적 호출은 작성 시에 완전히 사전 설정되며, 타겟 및 파라미터 값은 인스펙터 창에 정의됩니다. 콜백이 호출되면 타겟 함수가 인스펙터에 정의된 파라미터 값으로 호출됩니다. 이는 런타임 시 변하지 않는 값에 적합합니다. 예를 들어 특정 충돌이 발생할 때마다 체력 값을 일정 양만큼 줄이려는 경우입니다. 정적으로 바인딩된 함수는 함수 선택 리스트의 Static Parameters에 표시됩니다.
- 동적 호출은 호출되는 유형과 일치하는 파라미터로 코드에서 프로그래밍 방식으로 호출됩니다. 이는 런타임 시점에 달라지는 값에 적합합니다. 예를 들어 캐릭터가 각 공격에서 입은 손상의 변수를 나타내는
UnityEvent입니다. UI에는 콜백을 필터링하고, 해당float유형에 유효한 서명이 있는 동적 함수만 표시됩니다. 예를 들어UnityEvent가 있는 경우 함수 선택자에는 Dynamic string 헤더 아래에UnityEvent<string>파라미터를 허용하는 모든 함수가 나열됩니다.string
인스펙터 창에서 이벤트 유형과 일치하는 서명이 있는 정적 또는 동적 함수 중에서 선택
UnityEvent의 일반 지원
기본적으로 의 는 함수에 동적으로 바인딩됩니다. 그러나 다음 예시와 같이 최대 4개의 일반 유형 파라미터로 를 생성할 수 있습니다.
MonobehaviourUnityEventvoidUnityEventusing 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); } }}