Gameplay Ingredients是一组用于 Unity 游戏的运行时和编辑器工具:一组脚本的集合,可在制作游戏和原型时简化简单的任务。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

108 行
3.5 KiB

using UnityEngine;
using UnityEditor;
using UnityEngine.SceneManagement;
using UnityEditor.SceneManagement;
using UnityEditor.Callbacks;
namespace GameplayIngredients.Editor
{
public class EditorSceneSetup : ScriptableObject
{
[MenuItem("File/Save Scene Setup As... #%&S", priority = 171)]
static void SaveSetup()
{
string path = EditorUtility.SaveFilePanelInProject("Save EditorSceneSetup", "New EditorSceneSetup", "asset", "Save EditorSceneSetup?");
if(path != string.Empty)
{
EditorSceneSetup setup = GetCurrentSetup();
AssetDatabase.CreateAsset(setup, path);
}
}
public delegate void EditorSceneSetupLoadedDelegate(EditorSceneSetup setup);
public static event EditorSceneSetupLoadedDelegate onSetupLoaded;
[OnOpenAsset]
static bool OnOpenAsset(int instanceID, int line)
{
var obj = EditorUtility.InstanceIDToObject(instanceID);
if(obj is EditorSceneSetup)
{
EditorSceneSetup setup = (EditorSceneSetup)obj;
int active = setup.ActiveScene;
try
{
EditorUtility.DisplayProgressBar("Loading Scenes", string.Format("Loading Scene Setup {0}....", setup.name), 1.0f);
RestoreSetup(setup);
}
finally
{
EditorUtility.ClearProgressBar();
}
return true;
}
return false;
}
[MenuItem("Assets/Create/Editor Scene Setup", priority = 200)]
static void CreateAsset()
{
AssetFactory.CreateAssetInProjectWindow<EditorSceneSetup>("SceneSet Icon", "New SceneSetup.asset");
}
public int ActiveScene;
public EditorScene[] LoadedScenes;
[System.Serializable]
public struct EditorScene
{
public SceneAsset Scene;
public bool Loaded;
}
public static EditorSceneSetup GetCurrentSetup()
{
var scenesetups = EditorSceneManager.GetSceneManagerSetup();
var editorSetup = CreateInstance<EditorSceneSetup>();
int i = 0;
editorSetup.LoadedScenes = new EditorScene[scenesetups.Length];
foreach(var setup in scenesetups)
{
if (setup.isActive)
editorSetup.ActiveScene = i;
editorSetup.LoadedScenes[i].Scene = AssetDatabase.LoadAssetAtPath<SceneAsset>(setup.path);
editorSetup.LoadedScenes[i].Loaded = setup.isLoaded;
i++;
}
return editorSetup;
}
public static void RestoreSetup(EditorSceneSetup editorSetup)
{
SceneSetup[] setups = new SceneSetup[editorSetup.LoadedScenes.Length];
for(int i = 0; i < setups.Length; i++)
{
setups[i] = new SceneSetup();
string path = AssetDatabase.GetAssetPath(editorSetup.LoadedScenes[i].Scene);
setups[i].path = path;
setups[i].isLoaded = editorSetup.LoadedScenes[i].Loaded;
setups[i].isActive = (editorSetup.ActiveScene == i);
}
EditorSceneManager.RestoreSceneManagerSetup(setups);
if(onSetupLoaded != null)
onSetupLoaded.Invoke(editorSetup);
}
}
}