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モードを終了する時に発生します。 |
エディタ上でのみ動き、Editorフォルダ内にスクリプトが入っている必要があります。
EditorApplication-playModeStateChanged - Unity スクリプトリファレンス
Event that is raised whenever the Editor's play mode state changes.
コメント