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

How do I get a Unity scene name when they are stored as an array of Objects

我有一个对象列表。它们是Unity场景。

public Object[] scenes;

我想用 unity 场景填充这个数组,作为存储它们应该在 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)' (login(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...

如何从数组中的场景对象中获取字符串形式的场景名称?

不能在编辑器之外执行此操作。

当您使用 public UnityEngine.Object[] scenes; 保存场景时,Unity 将使用 SceneAsset 作为占位符来保存这些场景。

问题在于 SceneAsset 来自 UnityEditor 命名空间,这意味着您的代码 只能在编辑器 中使用 AssetDatabase. You can't build it to run on any standalone platform. You will get 如果您尝试构建项目,则会出错。

这是获取所有场景并将它们存储在数组中的方法(应该在编辑器中工作并构建):

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() 是一个覆盖函数,可以检索 对象的名称。

只需将对象数组转换为 SceneAsset,然后从中访问场景的名称,而不是像您当前正在做的那样访问 Object 的名称。

SceneManager.LoadScene(((SceneAsset)scenes[currentSceneNumber]).name);

SceneAsset scene = scenes[currentSceneNumber] as SceneAsset;
SceneManager.LoadScene(scene.name);