所以,我想做的事情似乎应该非常简单。我需要抓住下一个场景的名称(不加载它),如构建设置中所列。
我认为通过这样的方式我有一个简单的解决方案:
int currentIndex = SceneManager.GetActiveScene().buildIndex;
string nextSceneName = SceneManager.GetSceneAt(currentIndex + 1).name
但显然那是" GetSceneAt"不适用于构建设置中的场景,而是适用于SceneManager所具有的某种内部列表。
我的所有谷歌搜索都会根据您场景的特定命名顺序显示解决方案,或者在构建之前将场景列表导出到文件(手动需要导出的列表)等等。我不能想象这样一个简单的问题需要这么复杂的解决方案,这就是我要求自己的原因。
如何在构建设置中获取下一个场景的名称?
答案 0 :(得分:6)
从Unity 5.5开始,这应该可行,如果您使用的是早期版本,请参阅下文。
大多数人首先尝试的最直接的方法是使用SceneManager.GetSceneByBuildIndex(buildIndex)
,因为它返回一个带有name属性的Scene
对象。
但是......它的文档提到:
如果已将场景添加到给定构建索引的构建设置并且已加载场景,则此方法将返回有效场景。如果尚未加载,则SceneManager无法返回有效场景。
但是并没有丢失,因为还有SceneUtility.GetScenePathByBuildIndex(buildIndex)
并不依赖于已经加载的场景。它返回一个项目相对路径到场景,我们可以从中提取场景名称。
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和某些早期版本。
是的,不幸的是你是对的,但是......你很幸运!
我在阅读完你的问题之后创建了一个插件/资源,它是三个小脚本,它应该只是工作&#39;并且使用它实际上只是一行代码:
var buildSceneRecords = BuildScenes.Records;
记录包含编辑器构建设置中场景的名称,路径和索引。
您可以在此处获取:https://github.com/sindrijo/unity3d-runtime-buildscenes