C# 如何在Unity中修复意外的场景构建索引-1

C# 如何在Unity中修复意外的场景构建索引-1,c#,unity3d,scene-manager,C#,Unity3d,Scene Manager,基本上,在测试了一些关卡原型之后,我决定坚持我目前的游戏理念,因此我开始创建一个GameManager来控制关卡流等。在默认设置之外,我没有使用任何其他库或资产包,但出于某种原因,我所有场景的buildIndex都是-1,我根据API了解到,这意味着它们应该通过AssetBundle加载。现在我不能用SceneManager加载任何内容,我也不知道如何前进。我确实在项目中暂时保留了2d extras主文件夹,因为我认为我会使用它,但在意识到我不需要它后将其删除。有人知道如何将我的场景的构建索引重

基本上,在测试了一些关卡原型之后,我决定坚持我目前的游戏理念,因此我开始创建一个GameManager来控制关卡流等。在默认设置之外,我没有使用任何其他库或资产包,但出于某种原因,我所有场景的buildIndex都是-1,我根据API了解到,这意味着它们应该通过AssetBundle加载。现在我不能用SceneManager加载任何内容,我也不知道如何前进。我确实在项目中暂时保留了2d extras主文件夹,因为我认为我会使用它,但在意识到我不需要它后将其删除。有人知道如何将我的场景的构建索引重置为构建设置中的值吗?非常感谢您的帮助

编辑:我还应该提到的是,我添加的最新场景(当时我还有2d extras manager)仍然保留了0的正常构建索引

编辑#2:所以我发现我可以访问其他场景的构建索引。只有当我尝试从主菜单场景访问BuildIndex时,事情才不起作用

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


在“构建”菜单中,通过单击Unity Editor上的“文件”访问,您可以组织场景并将其添加到流中,如下图所示


我不确定,但我很惊讶当你没有为流指定场景时,它会得到sceneIndex=-1。因此,加载一个场景,转到BuildSettings,将其添加到构建流,对所有场景执行相同的操作。我认为这样可以解决问题。

SceneManager.GetSceneByBuildIndex
SceneManager.GetSceneByName
和类似的函数仅在加载的场景中工作。如果场景未加载,它将返回-1。原因是,您可以添加加载场景,所以甚至可以加载5个场景

诚然,api在许多方面都存在不足

在您的例子中,您正试图在
SceneManager.LoadScene(1)之后立即使用它
int index=SceneManager.GetSceneByName(“Main”).buildIndex
返回
-1
最有可能是因为场景将在下一帧“正式”加载

您可以尝试在协同程序中等待1帧,然后执行该操作。但通常情况下,您将有场景索引或场景名称来加载/保存它,而不关心场景加载后的逻辑。您可以创建一个管理器,该管理器将存储所有加载的场景,如果需要它们来决定下一步加载哪个场景,您可以在其中查找它们的构建索引


或者,您可以使用可寻址程序包,该程序包处理大量数据,但我认为场景加载效果更好。

所有场景都正确添加到构建设置中,但奇怪的是,如果我尝试使用我知道的索引强制加载(例如,如果Scene1使用LoadScene(2)加载索引2),但是如果我试图通过使用GetSceneByName(“Scene1”).buildIndex获取索引的值,它会返回-1哦,这真的很奇怪。显示包含它的代码的关键部分,也许我可以提供帮助。实际上,我仅有的代码是“SceneManager.LoadScene(1);”用于我菜单的播放按钮的onclick功能(其中场景1是我的buildsettings中的级别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);