在 Unity3D 的构建设置中获取下一个场景的名称?

Get name of next Scene in build settings in Unity3D?

所以,我想做的事情,看起来应该是异常的简单。我需要获取下一个场景的 name(不加载它),如构建设置中所列。

我认为我有一个简单的解决方案,方法如下:

int currentIndex = SceneManager.GetActiveScene().buildIndex;
string nextSceneName = SceneManager.GetSceneAt(currentIndex + 1).name

但显然 "GetSceneAt" 不适用于构建设置中的场景,而是适用于 SceneManager 具有的某种内部列表。

我的所有 google 搜索都会根据场景的特定命名顺序提出解决方案,或者在构建之前将场景列表导出到文件(需要手动导出的列表)等。我无法想象这么简单的问题需要这么复杂的解决方案,这就是我问自己的原因。

如何才能在构建设置中获取下一个场景的名称?

从 Unity 5.5 开始,这应该可以工作,如果您使用的是早期版本,请参见下文。

大多数人最先尝试的最直接的方法是使用 SceneManager.GetSceneByBuildIndex(buildIndex),因为它 returns 一个 Scene 对象,名称为 属性.

但是...它的文档提到:

This method will return a valid Scene if a scene has been added to the build settings at the given build index AND the scene is loaded. If it has not been loaded yet the SceneManager cannot return a valid Scene.

但是并没有全部丢失,因为还有 SceneUtility.GetScenePathByBuildIndex(buildIndex) 不依赖于已经加载的场景。它 returns 一个场景的项目相对路径,我们可以从中提取场景名称。

public static class SceneUtilityEx
{
    public static string GetNextSceneName()
    {
        var nextSceneIndex = SceneManager.GetActiveScene().buildIndex + 1;

        if (nextSceneIndex < SceneManager.sceneCountInBuildSettings)
        {
            return GetSceneNameByBuildIndex(nextSceneIndex);
        }

        return string.Empty;
    }

    public static string GetSceneNameByBuildIndex(int buildIndex)
    {
        return GetSceneNameFromScenePath(SceneUtility.GetScenePathByBuildIndex(buildIndex));
    }

    private static string GetSceneNameFromScenePath(string scenePath)
    {
        // Unity's asset paths always use '/' as a path separator
        var sceneNameStart = scenePath.LastIndexOf("/", StringComparison.Ordinal) + 1;
        var sceneNameEnd = scenePath.LastIndexOf(".", StringComparison.Ordinal);
        var sceneNameLength = sceneNameEnd - sceneNameStart;
        return scenePath.Substring(sceneNameStart, sceneNameLength);
    }
}

编辑:由于历史原因包含以下部分,仅适用于 Unity 5.4 和一些更早版本。

是的,不幸的是你是对的,但是......你很幸运!

我在阅读你的问题后为此创建了一个 plugin/asset,它是三个小脚本,它应该 'just work' 并且使用它实际上只是一行代码:

var buildSceneRecords = BuildScenes.Records;

记录包含编辑器构建设置中场景的名称、路径和索引。

你可以在这里得到它:https://github.com/sindrijo/unity3d-runtime-buildscenes