如何在Unity中修复-1的意外场景buildIndex

时间:2019-03-30 21:15:27

标签: c# unity3d scene-manager

基本上,在测试了几个关卡原型之后,我决定继续使用当前的游戏理念,因此我开始创建GameManager来控制关卡流程等。我没有任何其他库或资产包在默认值之外使用,但由于某种原因,我所有场景的buildIndex为-1(我根据API获悉),这意味着它们应该通过AssetBundle加载。现在,我无法使用SceneManager加载任何内容,而且不确定如何前进。我确实在项目中暂时拥有2d-extras-master文件夹,因为我以为自己会使用它,但是在意识到不需要它之后将其删除。有谁知道如何将场景的buildIndices重置为“构建设置”中的值?任何/所有帮助将不胜感激!

编辑:我还要提到的是,我添加的最新场景(当我仍然拥有2d-extras-manager时)仍然保留了正常的buildIndex 0

编辑#2:因此,我发现我可以访问其他场景之间的buildIndices。只有当我尝试从MainMenu场景访问buildIndices时,事情才不起作用

编辑#3:我找到了修复程序,但不一定能回答问题。我发现,如果我知道buildIndex是什么,就可以强制LoadScene函数工作,但是如果我通过场景名称搜索它,它将返回-1。

例如。

// where 1 is the buildIndex of Scene "Main" in BuildSettings
// works
SceneManager.LoadScene(1);

// doesn't work
int index = SceneManager.GetSceneByName("Main").buildIndex; //returns -1
SceneManager.LoadScene(index);

// also doesn't work (Where current scene is buildIndex 0)
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);

2 个答案:

答案 0 :(得分:0)

在构建菜单中,可通过单击Unity Editor上的File来访问,您可以组织场景并将其添加到流程中,就像image

我不确定,但是当您没有为流分配一个Scene时,我就假定它为sceneIndex = -1。因此,加载一个场景,转到BuildSettings,将其添加到构建流程中,并对所有场景进行相同的操作。我认为您可以通过这种方式解决它。

答案 1 :(得分:0)

SceneManager.GetSceneByBuildIndexSceneManager.GetSceneByName 以及类似的功能仅适用于加载的场景。如果场景未加载,它将返回 -1。原因是,您可以叠加加载场景,因此甚至可以加载 5 个场景。

API 确实在很多方面都缺乏。

在您的情况下,您尝试在 SceneManager.LoadScene(1); 之后立即使用它,int index = SceneManager.GetSceneByName("Main").buildIndex; 很可能返回 -1,因为场景将“正式”加载到下一帧。

您可以尝试在协程中等待 1 帧,然后再这样做。但通常你会有场景索引或场景名称来加载/保存它,而不关心场景加载后的逻辑。您可以创建一个管理器来存储所有加载的场景,如果您需要它们决定接下来加载哪个场景,您可以在其中查找它们的构建索引。

或者,您可以使用可处理很多内容的 Addressables 包,这很难进入,但在我看来,场景加载在那里效果更好。