Version: Unity 6.0 (6000.0)
언어 : 한국어
Using a custom update manager
시간 및 프레임 속도 관리

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

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라는 이벤트에 대한 콜백 설정
인스펙터 창에서 Trigger Entered 및 Trigger Exited라는 이벤트에 대한 콜백 설정

정적 및 동적 호출

UnityEvent인스펙터 창에서 설정하는 경우 두 가지 유형의 함수 호출이 지원됩니다.

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

UnityEvent의 일반 지원

기본적으로 MonobehaviourUnityEventvoid 함수에 동적으로 바인딩됩니다. 그러나 다음 예시와 같이 최대 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);
        }
    }
}

추가 리소스

Using a custom update manager
시간 및 프레임 속도 관리
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961