我在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
之外,我别无选择。任何帮助,将不胜感激。谢谢!
注意:我尝试在Start
和OnLevelWasLoaded
中找到对象。他们两个都不起作用。
我使用以下命令记录了每个游戏对象的层次结构:
foreach (GameObject obj in Object.FindObjectsOfType(typeof(GameObject)))
{
Debug.Log(obj.name);
}
在初始加载时,会记录我创建的游戏对象,但在重新加载场景后,不会加载我的对象。
我实际上找到了问题的根源。我在换父母 将我的对象从
null
移到另一个对象,这显然导致 问题。但是,我不知道如何解决此问题,因为我必须 改变父母,我无法改变这种逻辑。
答案 0 :(得分:0)
我实际上找到了解决方案。当我问这个问题时,我没有意识到问题是由于更换父母引起的。
DontDestroyOnLoad仅适用于根GameObjects
因此,当我向对象添加父对象时,对象被销毁。仅使父母为null是不够的。 DontDestroyOnLoad
必须再次应用。我找到的解决方案是这样的:
void ResetScene()
{
test.transform.parent = null;
DontDestroyOnLoad(test);
StartCoroutine(LoadScene());
}