我有一个对象列表。他们是Unity场景。
public Object[] scenes;
我想用统一场景填充这个数组,作为存储它们应该在Unity检查器中加载的顺序的便捷方式。
我尝试使用SceneManager使用对此数组的引用来加载关卡
public int currentSceneNumber = 0;
public void LoadNext()
{
if (scenes.Length >= currentSceneNumber + 1)
{
currentSceneNumber += 1;
SceneManager.LoadScene(scenes[currentSceneNumber].ToString());
}
else
{
Debug.Log("Level.cs: Unable to load next level.");
return;
}
}
但将场景转换为字符串会导致'scenename(UnityEngine.SceneAsset)'(登录(UnityEngine.SceneAsset)是问题部分。它将导致以下错误
Scene 'prototype02_Scene (UnityEngine.SceneAsset)' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.
To add a scene to the build settings use the menu File->Build Settings...
如何将场景名称作为数组中场景对象的字符串获取?
答案 0 :(得分:1)
你不能在编辑器外执行此操作。
当您使用public UnityEngine.Object[] scenes;
来保存场景时,Unity将使用SceneAsset
作为占位符来保存这些场景。
问题在于SceneAsset
来自UnityEditor
命名空间,这意味着您的代码只能在编辑中使用AssetDatabase。您无法构建它以在任何独立平台上运行。如果您尝试构建项目,则会出现this错误。
这是如何获取所有场景并将它们存储在一个数组中(应该在编辑器和构建中工作):
public Scene[] scenes;
...
void initScenes()
{
int sceneCount = SceneManager.sceneCountInBuildSettings;
scenes = new Scene[sceneCount];
for (int i = 0; i < sceneCount; i++)
{
scenes[i] = SceneManager.GetSceneByBuildIndex(sceneCount);
}
}
您的加载代码:
SceneManager.LoadScene(scenes[currentSceneNumber].name);
如果你确定这是一个编辑器插件,而不是你需要在编辑器之外构建或运行的东西,那么这就是你的答案:
首先,您正在使用与场景名称无关的对象名称,因为Object.ToString()
是一个覆盖函数,用于检索
对象的名称。
只需将Object数组转换为SceneAsset
,然后从中访问该场景的名称,而不是像您当前所做的那样Object
的名称。
SceneManager.LoadScene(((SceneAsset)scenes[currentSceneNumber]).name);
或
SceneAsset scene = scenes[currentSceneNumber] as SceneAsset;
SceneManager.LoadScene(scene.name);