如何将Unity场景名称存储为对象数组时,如何获取它

时间:2017-11-18 09:13:06

标签: c# unity3d scene

我有一个对象列表。他们是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...

如何将场景名称作为数组中场景对象的字符串获取?

1 个答案:

答案 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);