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