えんじにあ雑記!

開発していて学んだことをまとめていきます!

【Unity】Sceneの保存時に処理をフックする

Scene保存時に編集されていた値をリセットするなど、任意の処理をコールバックに登録する方法を解説します。

概要

Unity Editor上で作業している際に、Sceneの保存直前・直後に処理を挟みたいことや、Prefab保存時に処理を挟みたいなどの要望があると思います。 そういった際に使用できるコールバックや属性の使用方法をサンプルコードに示します。

サンプルコード

要点であるメソッドに付与している属性や、購読するイベントについてコメントに記載しています。

using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;

public static class EditorCallbackSample
{
    // この属性を付与した静的メソッドはEditor起動時やスクリプトコンパイル時に呼び出される
    [InitializeOnLoadMethod]
    public static void RegisterEditorCallbacks()
    {
        Debug.Log("Execute EditorCallbackSample.RegisterEditorCallbacks");
        
        // 呼び出されるたびに重複して登録されるように見えるが、毎回リセットされている挙動だった
        // ので、明示的に解除する必要はなさそう
        EditorSceneManager.sceneSaving += OnSceneSaving;
        EditorSceneManager.sceneSaved += OnSceneSaved;
    }

    private static void OnSceneSaving(Scene scene, string path)
    {
        // pathには Assets/Path/To/Scene.unity が渡される
        Debug.Log($"OnSceneSaving: {scene}, {path}");
    }

    private static void OnSceneSaved(Scene scene)
    {
        Debug.Log($"OnSceneSaved: {scene}");
    }
}