기술 자료

Unity Engine

Unity Engine

인스펙터에서 설정할 수 있는 커스텀 이벤트

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 이벤트는 직렬화 가능하다는 점입니다. 즉, 인스펙터 창에서 설정할 수 있습니다.
UnityEvent
는 모든
MonoBehaviour
에 추가할 수 있으며 표준 C# 델리게이트처럼 런타임 시 실행됩니다.
MonoBehaviour
에서
UnityEvent
가 선언되면 편집 시간과 런타임 사이에 유지되는 콜백을 정의할 수 있는 인스펙터 창에 표시됩니다.
Unity 이벤트에는 표준 C# 델리게이트와 유사한 제한이 있습니다.
  • 타겟 오브젝트에 대한 레퍼런스를 유지하여 타겟 오브젝트가 가비지 컬렉션이 되는 것을 막습니다.
  • 관리되는 (C#)
    UnityEngine.Object
    가 타겟으로 있고 관리되지 않는 (C++) 상대 오브젝트가 삭제된 경우 콜백이 호출되지 않습니다. 자세한 내용은 Null 레퍼런스를 참조하십시오.

Unity 이벤트 설정

선행 조건

  • using UnityEngine.Events
    를 포함하는 MonoBehaviour 스크립트 생성
  • UnityEvent
    유형의 필드를 하나 이상 선언

인스펙터 창에서 콜백 설정:

  1. 선언된
    UnityEvent
    필드가 포함된 스크립트 컴포넌트가 있는 게임 오브젝트를 선택합니다.
  2. 이벤트 이름 아래의 + 버튼을 클릭하여 콜백의 슬롯을 추가합니다.
  3. 콜백을 수신할 UnityEngine.Object를 선택합니다. 오브젝트 선택기를 사용하거나 오브젝트를 필드로 드래그 앤 드롭해도 됩니다.
  4. 이벤트가 발생할 때 호출될 함수를 선택합니다. 드롭다운 선택기는 게임 오브젝트와 해당 컴포넌트에서 사용할 수 있는 적절한 메서드의 필터링된 리스트로 채워집니다.
  5. 필요에 따라 1-4단계를 반복하여 동일한 이벤트에 콜백을 추가합니다.

인스펙터 창에서 Trigger Entered 및 Trigger Exited라는 이벤트에 대한 콜백 설정

정적 및 동적 호출

UnityEvent
를 인스펙터 창에서 설정하는 경우 두 가지 유형의 함수 호출이 지원됩니다.
  • 정적 호출은 작성 시에 완전히 사전 설정되며, 타겟 및 파라미터 값은 인스펙터 창에 정의됩니다. 콜백이 호출되면 타겟 함수가 인스펙터에 정의된 파라미터 값으로 호출됩니다. 이는 런타임 시 변하지 않는 값에 적합합니다. 예를 들어 특정 충돌이 발생할 때마다 체력 값을 일정 양만큼 줄이려는 경우입니다. 정적으로 바인딩된 함수는 함수 선택 리스트의 Static Parameters에 표시됩니다.
  • 동적 호출은 호출되는
    UnityEvent
    유형과 일치하는 파라미터로 코드에서 프로그래밍 방식으로 호출됩니다. 이는 런타임 시점에 달라지는 값에 적합합니다. 예를 들어 캐릭터가 각 공격에서 입은 손상의 변수를 나타내는
    float
    입니다. UI에는 콜백을 필터링하고, 해당
    UnityEvent
    유형에 유효한 서명이 있는 동적 함수만 표시됩니다. 예를 들어
    UnityEvent<string>
    가 있는 경우 함수 선택자에는 Dynamic string 헤더 아래에
    string
    파라미터를 허용하는 모든 함수가 나열됩니다.

인스펙터 창에서 이벤트 유형과 일치하는 서명이 있는 정적 또는 동적 함수 중에서 선택

UnityEvent의 일반 지원

기본적으로
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); } }}

추가 리소스