在运行时获取 Runtime/Creating 个场景的场景名称

Getting Scene Names at Runtime/Creating Scenes at runtime

我想在 Unity 版本 5 中构建一个 RTS 游戏。3.xxx。 我想要一个 select 我想玩的关卡的下拉菜单。 我不想对其进行硬编码,那么如何在运行时获取场景名称? 这是在游戏中添加新关卡所必需的。 那就是下一个问题。我如何创建新场景并将它们添加到运行时构建路径以在游戏中使用它们?例如在地图编辑器中?

我无法使用 UnityEditor 通过 foreach 遍历所有场景,因为它是一个编辑器 class 而这些不会进入最终版本..

谢谢

自 Unity 5.x 起,有更多强大的选项可用于在运行时管理场景。

获取当前场景名称:

SceneManager.GetActiveScene().name


获取添加到 SceneManager 的所有场景名称的列表:

var numScenes = SceneManager.sceneCount;
List<string> sceneNames = new List<string>(numScenes);

for (int i=0; i < numScenes; ++i)
{
   sceneNames.Add(StageManager.GetSceneAt(i).name);
}

正在运行时创建新场景:

var newScene = SceneManager.CreateScene(string sceneName);

在运行时将新场景添加到构建路径:

我很确定这是不可能也不推荐的。

如果您想要在您的游戏中使用关卡编辑器的功能,请考虑编写您自己的序列化场景的方法,以便它可以在运行时反序列化为一个空场景。


另请参阅:

如前所述here on the Unity forums, SceneManager.GetSceneAt仅适用于当前活动场景。

目前,您需要使用变通方法在 运行 时间内使用 EditorBuildSettings.scenes 在您的构建中获取 所有 个场景。没错,这仅在编辑期间可用,但您只需确保在构建之前将它们缓存到 运行 时间资产或组件。

另请注意,documentation example for EditorBuildSettings.scenes 实际上为您提供了一个非常强大的脚本来获取所有场景,包括那些尚未添加到构建设置中的场景(甚至将它们添加到构建设置中,使用单个按钮点击)!您可以只使用它来将所有场景路径保存到一个组件或 ScriptableObject,然后在 运行 时间内可用。

旧的我知道,但它符合我的搜索,所以我发布了我的解决方案。这似乎可以在运行时使用 SceneUtility.GetScenePathByBuildIndex

我做了什么:

var sceneNames = new List<string>();
var regex = new Regex(@"([^/]*/)*([\w\d\-]*)\.unity");
for (int i = 0; i < SceneManager.sceneCountInBuildSettings; i++)
{
    var path = SceneUtility.GetScenePathByBuildIndex(i);
    var name = regex.Replace(path, "");
    sceneNames.Add(name);
}

Regex Credit