Last active
March 11, 2016 03:16
-
-
Save KzoNag/f47e8eddec95afd7b3da to your computer and use it in GitHub Desktop.
[Unity][マルチシーン]シーン構成保存・復元エディタスクリプト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using UnityEngine.SceneManagement; | |
using UnityEditor; | |
using UnityEditor.SceneManagement; | |
using System.Linq; | |
using System.Collections; | |
public static class SceneSetupTool | |
{ | |
[MenuItem("Tool/Scene/Save Current Setup")] | |
public static void SaveSetup() | |
{ | |
// 現在のシーン状態インスタンスを生成 | |
var obj = SceneSetupObject.CreateCurrent(); | |
// 保存 | |
AssetDatabase.CreateAsset(obj, "Assets/SceneSetup.asset"); | |
} | |
[MenuItem("Tool/Scene/Load Setup")] | |
public static void LoadSetup() | |
{ | |
// シーン状態情報を読み込み | |
var obj = AssetDatabase.LoadAssetAtPath<SceneSetupObject>("Assets/SceneSetup.asset"); | |
// それをもとにシーン再構築 | |
EditorSceneManager.RestoreSceneManagerSetup(obj.GetSceneManagerSetup()); | |
} | |
} | |
/// <summary> | |
/// シーンのロード状態保持アセットクラス | |
/// </summary> | |
public class SceneSetupObject : ScriptableObject | |
{ | |
/// <summary> | |
/// SceneSetupクラスをシリアライズするためだけのクラス | |
/// SceneSetup自体がSerializableであれば不要 | |
/// </summary> | |
[System.Serializable] | |
public class SerializableSetup | |
{ | |
public string path; | |
public bool isActive; | |
public bool isLoaded; | |
} | |
/// <summary> | |
/// シリアライズされるSceneSetup配列 | |
/// </summary> | |
[SerializeField] | |
private SerializableSetup[] serializables; | |
/// <summary> | |
/// シリアライズ情報からSceneSetup配列を取得 | |
/// </summary> | |
public SceneSetup[] GetSceneManagerSetup() | |
{ | |
if (serializables == null) | |
{ | |
return null; | |
} | |
return serializables | |
.Select(_info => SerializableToSetup(_info)) | |
.ToArray(); | |
} | |
/// <summary> | |
/// 現在のシーンロード状態を保持するインスタンスを生成 | |
/// </summary> | |
public static SceneSetupObject CreateCurrent() | |
{ | |
var setups = EditorSceneManager.GetSceneManagerSetup(); | |
var obj = ScriptableObject.CreateInstance<SceneSetupObject>(); | |
obj.serializables = setups | |
.Select(_setup => SetupToSerializable(_setup)) | |
.ToArray(); | |
return obj; | |
} | |
private static SceneSetup SerializableToSetup(SerializableSetup info) | |
{ | |
return new SceneSetup() | |
{ | |
path = info.path, | |
isActive = info.isActive, | |
isLoaded = info.isLoaded | |
}; | |
} | |
private static SerializableSetup SetupToSerializable(SceneSetup setup) | |
{ | |
return new SerializableSetup() | |
{ | |
path = setup.path, | |
isActive = setup.isActive, | |
isLoaded = setup.isLoaded | |
}; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment