【问题标题】:GameObject.Find does not work in Android build after reloading Scene重新加载场景后,GameObject.Find 在 Android 构建中不起作用
【发布时间】:2019-01-30 01:15:13
【问题描述】:

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

然后我使用AsyncOperation 加载我的第二个场景并使用GameObject.Find 找到我的对象。这很好用,我可以找到对象并进行操作。然而,在我的第二个场景中,我有一个重置按钮,我使用AsyncOperation 重新加载相同的场景。重新加载场景时GameObject.Find 找不到我的对象。顺便说一句,这只发生在 Android 构建中。在编辑器中发现对象没有问题。

这就是我重新加载场景的方式,我的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 到另一个对象,显然这导致 问题。但是,我不知道如何解决这个问题,因为我必须 更改父级我无法更改该逻辑。

【问题讨论】:

  • 我可以看看你的统一日志吗?
  • 你可以从here看到它
  • 当您使用 Find 时,新父级是否可能处于非活动状态?Find 的变体仅返回活动和启用的对象/组件!
  • 不,实际上我正在更改对象的父对象,并且由于 DontDestroyOnLoad 不能应用于子对象,我的对象已被破坏,但我不知道如何解决这个问题。如果我再次创建父 null,它并不能解决问题。

标签: c# unity3d


【解决方案1】:

我实际上找到了解决方案。当我问这个问题时,我没有意识到这个问题是因为改变了父母。

DontDestroyOnLoad 仅适用于根 GameObjects

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

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

【讨论】:

  • 嗯,我有一个 ARCore 会话,我正在锚定对象。我不得不禁用该脚本,以便它可以在编辑器中工作:)
  • 很高兴您找到了解决方案;)但请下次尝试从头开始将所有必需的信息添加到您的问题中。
  • 我知道我应该有,但我试图保持最小,因为它是一个大项目。
猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
相关资源
最近更新 更多