1. 将编辑器场景添加到构建设置中
首先,您可以使用编辑器脚本来收集设置,使用 EditorSceneManager.GetSceneManagerSetup 来接收编辑器中场景的当前设置。
1.a. 在 MenuItem 单击时更新
我将其作为菜单中的额外按钮,因为您可能不希望它总是自动执行。
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.SceneManagement;
public static class UpdateBuildSettigns
{
[MenuItem("Example/UpdateBuildSettings")]
public static void UpdateSettings()
{
SceneSetup[] editorScenes = EditorSceneManager.GetSceneManagerSetup();
var activeEditorScenes = editorScenes.Where(scene => scene.isLoaded);
List<EditorBuildSettingsScene> editorBuildSettingsScenes = new List<EditorBuildSettingsScene>();
foreach (var sceneAsset in activeEditorScenes)
{
string scenePath = sceneAsset.path;
if (!string.IsNullOrEmpty(scenePath)) continue;
editorBuildSettingsScenes.Add(new EditorBuildSettingsScene(scenePath, true));
}
EditorBuildSettings.scenes = editorBuildSettingsScenes.ToArray();
}
}
菜单按钮更新
1.b. 在场景加载和卸载时自动更新
如果您想要自动发生更新,您还可以将调用添加为回调到EditorSceneManager.sceneOpened 和EditorSceneManager.sceneClosed,使用InitializeOnLoad和一个静态构造函数,以在重新编译或打开Unity Editor后添加回调。
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
[InitializeOnLoad]
public static class UpdateBuildSettigns
{
[MenuItem("Example/UpdateBuildSettings")]
public static void UpdateSettings()
{
}
static UpdateBuildSettigns()
{
EditorSceneManager.sceneOpened -= OnSceneLoaded;
EditorSceneManager.sceneClosed -= OnSceneUnloaded;
EditorSceneManager.sceneOpened += OnSceneLoaded;
EditorSceneManager.sceneClosed += OnSceneUnloaded;
}
private static void OnSceneUnloaded(Scene current)
{
UpdateSettings();
}
private static void OnSceneLoaded(Scene current, OpenSceneMode mode)
{
UpdateSettings();
}
}
使用自动更新
1.c. 启用/禁用自动更新
如果您想要更多的控制权,您还可以添加额外的菜单项来启用和禁用自动更新,例如:
private static bool isEnabled;
[MenuItem("Example/EnableAutoUpdate", true)]
private static bool CanEnable()
{
return !isEnabled;
}
[MenuItem("Example/DisableAutoUpdate", true)]
private static bool CanDisable()
{
return isEnabled;
}
[MenuItem("Example/EnableAutoUpdate")]
private static void EnableAutoUpdate()
{
EditorSceneManager.sceneOpened -= OnSceneLoaded;
EditorSceneManager.sceneClosed -= OnSceneUnloaded;
EditorSceneManager.sceneOpened += OnSceneLoaded;
EditorSceneManager.sceneClosed += OnSceneUnloaded;
isEnabled = true;
}
[MenuItem("Example/DisableAutoUpdate")]
private static void DisableAutoUpdate()
{
EditorSceneManager.sceneOpened -= OnSceneLoaded;
EditorSceneManager.sceneClosed -= OnSceneUnloaded;
isEnabled = false;
}
注意,由于使用了UnityEditor命名空间,您应该将此脚本放置在一个编辑器文件夹中或使用正确的预处理器。
#if UNITY_EDITOR
#endif
2. 从构建设置中加载所有场景
稍后在第一个场景运行应用程序时,应该有一个负责加载所有这些场景的脚本。例如:
public class SceneLoader : MonoBehaviour
{
private void Start()
{
var thisScene = SceneManager.GetActiveScene();
for(int i = 0; i < SceneManager.sceneCountInBuildSettings; i++)
{
if(thisScene.buildIndex == i) continue;
if(SceneManager.GetSceneByBuildIndex(i).IsValid()) continue;
SceneManager.LoadScene(i, LoadSceneMode.Additive);
SceneManager.LoadSceneAsync(i, LoadSceneMode.Additive);
}
}
}
refs: