如何修复Unity中意外的场景buildIndex为-1问题

4
基本上,经过测试几个级别的原型后,我决定坚持我的当前游戏想法,所以我开始创建一个GameManager来控制关卡流程等。我没有使用除默认库之外的其他库或资产包,但是由于某种原因,所有场景的buildIndex都是-1,根据API的说法,这意味着它们应该通过AssetBundle加载。现在我无法使用SceneManager加载任何东西,也不知道如何继续前进。我曾经临时在项目中放置了2d-extras-master文件夹,因为我认为我会使用它,但是后来意识到我不需要它而将其删除。有人知道如何将我的场景的buildIndices重置为Build Settings中的值吗?非常感谢任何/所有帮助!
编辑:我还应该提到,我添加的最新场景(当我仍然拥有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);
3个回答

1

SceneManager.GetSceneByBuildIndex或者SceneManager.GetSceneByName等函数只能在已加载的场景上工作。如果场景没有被加载,它将返回-1。原因是,你可以增量地加载场景,所以甚至可以加载5个场景。

这个API确实在很多方面都有缺陷。

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

你可以尝试在协程中等待1帧,然后再执行。但通常你会有场景索引或场景名称来加载/保存它,并不关心场景加载后的逻辑。你可以创建一个管理器来存储所有已加载的场景,在那里你可以查找它们的构建索引,如果需要决定下一个要加载的场景,就可以用到它们。

另外,你也可以使用Addressables包,它处理了很多事情,虽然很难入门,但我认为场景加载在那里效果更好。


0

0
在Unity编辑器中,通过单击“文件”访问构建菜单,您可以组织场景并将它们添加到流程中,就像这个image一样。
我不确定,但我认为当您没有将场景分配给流程时,它会得到sceneIndex = -1。因此,加载一个场景,转到BuildSettings,将其添加到构建流程中,对所有场景都执行相同的操作。我认为这样可以解决问题。

所有场景都已正确添加到“构建设置”中,但奇怪的是,如果我尝试使用我知道的索引强制加载(例如,如果Scene1的索引为2,则使用LoadScene(2)进行加载),但如果我尝试使用GetSceneByName("Scene1").buildIndex获取索引值,则返回-1。 - Adam Elaoud
嗯,这真的很奇怪。展示一下你代码中包含它的关键部分,也许我可以帮忙。 - Marcos Defina
我唯一的代码是在我的菜单播放按钮的onclick函数中使用“SceneManager.LoadScene(1);”(其中场景1是我构建设置中的第1级)。 - Adam Elaoud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接