【Unity】Playモードのタイミングでシーンを自動保存する方法【エディタ拡張】

Tips

Unityではシーンを編集した後明示的に保存しないといけません。
そのため、シーンの保存忘れによるデータの消失なども起きてしまう可能性があります。
git管理してる場合は保存するまでgitに差分が出ないため、gitに差分を上げ忘れるなどもやりがちですよね。

今回はその対策として、UnityエディタがPlayモードのタイミングで自動的にシーンをセーブする方法
また、同じタイミングでシーンのバックアップを保存する方法についても説明します。

スポンサーリンク

Playモードに入る時に自動でシーンを上書き保存する方法

using UnityEditor;
using UnityEditor.SceneManagement;

[InitializeOnLoad]
public class AutoSaveSceneOnPlay
{
    static AutoSaveSceneOnPlay()
    {
        EditorApplication.playModeStateChanged += OnPlayModeChanged;
    }

    private static void OnPlayModeChanged(PlayModeStateChange state)
    {
        if (state == PlayModeStateChange.ExitingEditMode)
        {
            EditorSceneManager.SaveOpenScenes();
        }
    }
}

こちらのコードでcsファイルを作成して、[Editor]フォルダ内にファイルを置けば動きます。

Playモードに入る時に自動でシーンのバックアップを保存する方法

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

[InitializeOnLoad]
public class BackupSceneOnPlay
{
    private const string BACKUP_FOLDER = "Assets/Backup/";

    static BackupSceneOnPlay()
    {
        EditorApplication.playModeStateChanged += OnPlayModeChanged;
    }

    private static void OnPlayModeChanged(PlayModeStateChange state)
    {
        if (state == PlayModeStateChange.ExitingEditMode)
        {
            BackupCurrentScene();
        }
    }

    private static void BackupCurrentScene()
    {
        Scene currentScene = SceneManager.GetActiveScene();
        string backupPath = BACKUP_FOLDER + currentScene.name + "_backup.unity";

        if (!System.IO.Directory.Exists(BACKUP_FOLDER))
        {
            System.IO.Directory.CreateDirectory(BACKUP_FOLDER);
        }

        EditorSceneManager.SaveScene(currentScene, backupPath);
    }
}

同じくcsファイルを作成して、[Editor]フォルダ内にファイルを置けば動きます。
EditorSceneManager.SaveSceneはEditモード時のみ機能します。

解説

InitializeOnLoad

エディター起動時にスクリプトのコンストラクタを呼びだす属性です。
これを付けることで処理の登録を自動で呼び出しています。

起動時エディタースクリプト実行 - Unity マニュアル
Unity 起動の直後に、ユーザーのアクションなしでプロジェクトのエディタースクリプトコードを実行することが役立つことがしばしばあります。これは InitializeOnLoad 属性を static constructor (スタティック...

EditorApplication.playModeStateChanged

Unityエディタの再生状態が変わった時に行う処理を登録するイベントです。
コールバックの引数として、PlayModeStateChange型が渡されます。

EnteredEditModeエディターアプリケーションがEditモードで、以前はPlayモードだった場合、次回の更新時に発生します。
ExitingEditModeエディターがPlayモードになる前にEditモードを終了する時に発生します。
EnteredPlayModeエディターアプリケーションがPlayモードで、以前はEditモードであった場合、次回の更新時に発生します。
ExitingPlayModeエディターがEditモードになる前にPlayモードを終了する時に発生します。
PlayModeStateChangeのタイプ

エディタ上でのみ動き、Editorフォルダ内にスクリプトが入っている必要があります。

EditorApplication-playModeStateChanged - Unity スクリプトリファレンス
Event that is raised whenever the Editor's play mode state changes.
Tipsエディタ拡張小ネタ&小技
スポンサーリンク
フーシャ

主にUnityを触ってるクライアントエンジニア。
学部の情報工学科卒業後、
スマホ向けゲームの開発/運営会社に新卒で入社して現在5年目の社会人です。

フーシャをフォローする
フーシャをフォローする

コメント

タイトルとURLをコピーしました