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

> Create your own custom events to configure persistent (lasting between Edit mode and Play mode) callbacks in the Inspector window.

Unity는 표준 C# [이벤트 및 델리게이트](https://learn.microsoft.com/en-us/dotnet/standard/events/)에 대한 Unity 전용 대안으로 [UnityEvent](/engine/6000.0/script-reference/unity-engine-events/unity-event.md) API를 제공합니다. 일반 C# 이벤트와 비교했을 때 Unity 이벤트의 주요 이점은 Unity 이벤트는 직렬화 가능하다는 점입니다. 즉, [인스펙터 창](/engine/6000.0/manual/unity-editor/using-the-editor/using-the-inspector.md)에서 설정할 수 있습니다.

`UnityEvent`는 모든 `MonoBehaviour`에 추가할 수 있으며 표준 C# 델리게이트처럼 런타임 시 실행됩니다. `MonoBehaviour`에서 `UnityEvent`가 선언되면 편집 시간과 런타임 사이에 유지되는 콜백을 정의할 수 있는 **인스펙터** 창에 표시됩니다.

Unity 이벤트에는 표준 C# 델리게이트와 유사한 제한이 있습니다.

* 타겟 오브젝트에 대한 레퍼런스를 유지하여 타겟 오브젝트가 가비지 컬렉션이 되는 것을 막습니다.
* 관리되는 (C#) `UnityEngine.Object`가 타겟으로 있고 관리되지 않는 (C++) 상대 오브젝트가 삭제된 경우 콜백이 호출되지 않습니다. 자세한 내용은 [Null 레퍼런스](/engine/6000.0/manual/scripting/object-oriented-development/null-reference-exception.md)를 참조하십시오.

## Unity 이벤트 설정

### 선행 조건

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

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

1. 선언된 `UnityEvent` 필드가 포함된 스크립트 컴포넌트가 있는 게임 오브젝트를 선택합니다.

2. 이벤트 이름 아래의 + 버튼을 클릭하여 콜백의 슬롯을 추가합니다.

3. 콜백을 수신할 [UnityEngine.Object](/engine/6000.0/manual/scripting/get-started/fundamental-unity-types/class-object.md)를 선택합니다. 오브젝트 선택기를 사용하거나 오브젝트를 필드로 드래그 앤 드롭해도 됩니다.

4. 이벤트가 발생할 때 호출될 함수를 선택합니다. 드롭다운 선택기는 게임 오브젝트와 해당 컴포넌트에서 사용할 수 있는 [적절한 메서드](#static-dynamic-calls)의 필터링된 리스트로 채워집니다.

5. 필요에 따라 1-4단계를 반복하여 동일한 이벤트에 콜백을 추가합니다.


**인스펙터 창에서 Trigger Entered 및 Trigger Exited라는 이벤트에 대한 콜백 설정:**
![](/api/media?file=/engine/6000.0/media/images/unityevents-inspector.PNG)

### 정적 및 동적 호출

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

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


**인스펙터 창에서 이벤트 유형과 일치하는 서명이 있는 정적 또는 동적 함수 중에서 선택:**
![](/api/media?file=/engine/6000.0/media/images/unityevents-dynamic-static.PNG)

## UnityEvent의 일반 지원

기본적으로 `Monobehaviour`의 `UnityEvent`는 `void` 함수에 동적으로 바인딩됩니다. 그러나 다음 예시와 같이 최대 4개의 일반 유형 파라미터로 `UnityEvent`를 생성할 수 있습니다.

```lang-csharp
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);
        }
    }
}
```

## 추가 리소스

* [드래그 앤 드롭 이벤트로 문, 트리거 등 설정](https://youtu.be/tmmvhxQcbJk)
* [UnityEvent API 레퍼런스](/engine/6000.0/script-reference/unity-engine-events/unity-event.md)
