2017-11-18 135 views
0

我有一个对象列表。他们是Unity场景。如何将对象数组存储为一个Unity场景名称

public Object[] scenes; 

我想填补这个数组团结的场面,作为存储顺序,他们应该团结的检查中加载的一种便捷方式。

我试图使用场景管理器使用的参考的水平加载到该阵列

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

他明确表示,加入所有场景'建立Settings',然后再次检查你的代码 – ahmetson

回答

1

不能在编辑器外面做这个。

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

的问题,这是SceneAssetUnityEditor命名空间,这意味着你的代码将在编辑器与该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); 
+0

感谢您的回答程序员。这一切都有道理。你提出的解决方案,我可以想象的作品,但不幸的是击败了我试图的目的。 我想避免必须使用构建设置窗口来组织我的场景。 我希望能够方便的拖拽到巡视窗口中,并选择与游戏构建相关的场景。 – Jim

+0

为避免使用构建设置,您必须编写更多代码。你必须用Menu来编写自己的自定义编辑器构建脚本(** ScriptA **),你可以使用它来构建你的项目。然后,您可以编写另一个脚本(** ScriptB **),将阵列中的SceneAsset添加到Assetbundle中,然后将AssetBundle复制到StreamingAssets文件夹。当您从** ScriptA **中单击您的构建函数时,它将执行我在** ScriptB **中描述的操作,然后它将返回到** ScriptA **并构建项目。 – Programmer

相关问题