在 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
所以,我想做的事情,看起来应该是异常的简单。我需要获取下一个场景的 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