我想在Unity版本5.3.xxx中构建一个RTS游戏。 我想要一个下拉菜单来选择我想要播放的关卡。 我不想硬编码,所以如何在运行时获取场景名称? 这是添加新级别游戏的必要条件。 那是下一个问题。如何在运行时创建新场景并将其添加到构建路径以使用它们?例如在地图编辑器中?
我无法使用UnityEditor通过foreeach遍历所有场景,因为它是一个编辑器类而且这些都没有进入最终构建..
由于
答案 0 :(得分:4)
从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);
在运行时将新场景添加到构建路径:
我很确定这是不可能也不推荐的。
如果您想在游戏中使用关卡编辑器的功能,请考虑编写自己的序列化场景的方法,以便在运行时将其反序列化为空场景。
另见:
答案 1 :(得分:1)
正如here on the Unity forums所述,SceneManager。GetSceneAt仅适用于当前有效场景。
目前,您需要使用EditorBuildSettings.scenes在运行时使用变通方法在构建中获取所有场景。您是对的,这仅在编辑期间可用,但您可以确保在构建之前将它们缓存到运行时资产或组件。
另请注意,documentation example for EditorBuildSettings.scenes实际上为您提供了一个非常强大的脚本来抓取所有场景,包括尚未添加到构建设置的场景(甚至将它们添加到构建设置中,只需单击一下按钮)!您可以使用它将所有场景路径保存到组件或ScriptableObject
,然后在运行时可用。
答案 2 :(得分:0)
我知道老了,但它与我的搜索匹配,所以我发布了解决方案。现在似乎可以在运行时使用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, "$2");
sceneNames.Add(name);
}