重新加载Scene

时间:2019-01-29 14:34:50

标签: c# unity3d

我在Unity中有两个场景。第一个是从二进制文件导入数据,导入文件后,我用从二进制文件读取的坐标创建一个游戏对象。我为此游戏对象使用DontDestroyOnLoad

然后,我使用AsyncOperation加载第二个场景,并使用GameObject.Find找到我的对象。这工作正常,我可以找到对象并进行操作。但是,在第二个场景中,我有一个重置按钮,可以使用AsyncOperation重新加载相同的场景。重新加载场景后,GameObject.Find找不到我的对象。顺便说一下,这仅发生在Android版本中。在Editor中,它发现对象没有问题。

这是我重新加载场景的方法,当按下按钮时,会调用ResetScene函数。

void ResetScene()
    {
        StartCoroutine(LoadAsyncScene());
    }
    IEnumerator LoadAsyncScene()
    {
        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("ARSession");

        while (!asyncLoad.isDone)
        {
            yield return null;
        }
    }

有人知道为什么会发生此问题吗?有人对找到对象有更好的想法吗?由于我是在运行时创建对象的,所以我觉得除了GameObject.Find之外,我别无选择。任何帮助,将不胜感激。谢谢!

注意:我尝试在StartOnLevelWasLoaded中找到对象。他们两个都不起作用。

我使用以下命令记录了每个游戏对象的层次结构:

        foreach (GameObject obj in Object.FindObjectsOfType(typeof(GameObject)))
        {

                Debug.Log(obj.name);
        }

在初始加载时,会记录我创建的游戏对象,但在重新加载场景后,不会加载我的对象。

  

我实际上找到了问题的根源。我在换父母   将我的对象从null移到另一个对象,这显然导致   问题。但是,我不知道如何解决此问题,因为我必须   改变父母,我无法改变这种逻辑。

1 个答案:

答案 0 :(得分:0)

我实际上找到了解决方案。当我问这个问题时,我没有意识到问题是由于更换父母引起的。

  

DontDestroyOnLoad仅适用于根GameObjects

因此,当我向对象添加父对象时,对象被销毁。仅使父母为null是不够的。 DontDestroyOnLoad必须再次应用。我找到的解决方案是这样的:

void ResetScene()
{ 
    test.transform.parent = null;
    DontDestroyOnLoad(test);
    StartCoroutine(LoadScene());
}