UnityEventのインスペクター管理とシーンファイルにおけるシリアライズ情報

2025年3月26日

Unityでは、UnityEventを通じてイベント処理を柔軟に管理できます。
各イベントハンドラー(どのメソッドが実行されるか)は、シーンファイルにシリアライズされた状態で保存されるため、スクリプト自体を変更することなくインスペクター上で設定を行うことが可能です。

これから、読んでみましょう

サンプルプロジェクト

エディター画面

デバッグ表示

実行結果

シーンファイル内のシリアライズ情報

シーンファイル(SampleScene.unity)の一部には、以下のようにシリアライズされたイベント情報が記述されています。
ここでは、対象オブジェクトと呼び出されるメソッドが記録され、実行時にその情報に基づいてイベントが処理されます。

--- !u!114 &912011094
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 912011092}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 9c812735c477845d782e68c76e4c6289, type: 3}
  m_Name: 
  m_EditorClassIdentifier: 
  unityEvent:
    m_PersistentCalls:
      m_Calls:
      - m_Target: {fileID: 912011095}
        m_TargetAssemblyTypeName: ShowSample, Assembly-CSharp
        m_MethodName: Show
        m_Mode: 1
        m_Arguments:
          m_ObjectArgument: {fileID: 0}
          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
          m_IntArgument: 0
          m_FloatArgument: 0
          m_StringArgument: 
          m_BoolArgument: 0
        m_CallState: 2
--- !u!114 &912011095
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 912011092}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 36a5264d023284922835fe9c6007ab7c, type: 3}
  m_Name: 
  m_EditorClassIdentifier: 
  • m_Target と m_MethodName により、どのオブジェクトのどのメソッドが実行されるかが指定されます。
  • シーンに保存されているため、プログラムコードの変更なしにイベントの設定が反映されます。

サンプルコードの解説

InspectorSet.cs

このスクリプトは、インスペクター上で設定された UnityEvent を保持し、シーン開始時にイベントを発行します。

using UnityEngine;
using UnityEngine.Events;

public class InspectorSet : MonoBehaviour
{
    public UnityEvent unityEvent;

    void Start()
    {
        unityEvent.Invoke();
    }
}
  • unityEvent はインスペクター上で設定され、どのコールバックが実行されるかはシーンファイルに記録されています。
  • Start() メソッドでイベントを呼び出し、設定された処理を実行します。

ShowSample.cs

このスクリプトは、イベントのコールバックとして実行されるメソッドを定義しています。

using UnityEngine;

public class ShowSample : MonoBehaviour
{
    public void Show()
    {
        Debug.Log("コールバック");
    }
}

まとめ

Unityのインスペクターを利用したUnityEventの管理は、シーンファイルにシリアライズされた設定情報をもとに、
プログラムコードの修正なしにイベント処理を柔軟に設定できる仕組みです。
上記の例では、InspectorSet.cs がイベントを発行し、シーンファイルに記録された情報に基づいて ShowSample.cs の Show() メソッドが実行される流れを示しています。

Unity

Posted by hidepon