# Inspector で設定可能なカスタムイベント

> 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 イベントがシリアル化可能である、つまり [Inspector ウィンドウ](/engine/6000.0/manual/unity-editor/using-the-editor/using-the-inspector.md) で設定できることです。

`UnityEvent` は任意の `MonoBehaviour` に追加でき、標準の C# デリゲートのようにランタイムに実行されます。`UnityEvent` が `MonoBehaviour` で宣言されると **Inspector** ウィンドウに表示され、編集時からランタイムまで存続するコールバックを定義できます。

UnityEvent には、標準の C# デリゲートと同様の制限があります。

* ターゲットオブジェクトへの参照を保持し、ターゲットオブジェクトのガベージコレクションを停止します。
* マネージ (C#) `UnityEngine.Object` をターゲットとし、アンマネージ (C++) の対応するオブジェクトが破棄されている場合、コールバックは実行されません。詳細は、[Null 参照](/engine/6000.0/manual/scripting/object-oriented-development/null-reference-exception.md) を参照してください。

## Unity イベントの設定

### 必要な要件

* `using UnityEngine.Events` を含む MonoBehaviour スクリプトの作成
* 1 つ以上の `UnityEvent` 型フィールドの宣言

### Inspector ウィンドウでのコールバック設定

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 のステップを繰り返し、同じイベントにコールバックを追加します。


**Inspector ウィンドウで Trigger Entered および Trigger Exited というイベントのコールバックを設定:**
![](/api/media?file=/engine/6000.0/media/images/unityevents-inspector.PNG)

### 静的呼び出しと動的呼び出し

**Inspector** ウィンドウから `UnityEvent` を設定する場合、サポートされる関数には 2 つの種類があります。

* **静的** 呼び出しはオーサリング時に完全に事前設定され、Inspector ウィンドウで定義したターゲットとパラメーターの値を使用します。コールバックが発生すると、Inspector で定義したパラメーターの値を使用してターゲット関数が実行されます。これは、ランタイムに変動しない値に適しています。例えば、特定の衝突が発生するたびに、設定した量だけ体力値を減分したい場合などです。静的にバインドされた関数は、関数選択リストの **Static Parameters** の下に表示されます。
* **動的** 呼び出しはコードからプログラムで呼び出され、呼び出される `UnityEvent` の型に一致するパラメーターを使用します。これはランタイムで変化する値、例えばキャラクターが各攻撃で受けるダメージの変数量を表す `float` などに適しています。UI はコールバックにフィルターをかけ、`UnityEvent` の型で有効なシグネチャを持つ動的関数のみを表示します。例えば、`UnityEvent<string>` がある場合、関数セレクターは **Dynamic string** ヘッダーの下に `string` パラメーターを受け取るすべての関数を表示します。


**Inspector ウィンドウでシグニチャがイベントの型と一致する静的関数と動的関数を選択:**
![](/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)
