DontDestroyOnLoad未在场景中工作

本文关键字:工作 在场 DontDestroyOnLoad | 更新日期: 2023-09-27 18:28:14

我需要在场景上应用DontDestroyOnLoad。这可能吗?

当我进入另一个场景时,我也需要不要打扰场景。在我发送邮件之前,当点击发送按钮时,它将进入邮件服务器中的身份验证。在这个时候,我的场景空闲意味着在返回邮件服务器的响应之前不做任何响应,所以当时我在我的场景中显示了一个加载栏。这不是do进程。整个场景都是挂起的,直到收到邮件服务器的响应,那么如何解决这个问题呢?

 void  Awake()
{
      DontDestroyOnLoad(this.gameObject);
}

DontDestroyOnLoad未在场景中工作

在阅读了这么多没有答案的内容后,我终于在Unity论坛上找到了答案。DontDestroyOnLoad仅在所讨论的游戏对象处于";根级别";意思是正好在场景下,而不是嵌套在任何其他对象下。文档中没有提到这一点。

加载新关卡scene时,上一场景的所有游戏对象都会被Unity破坏。

如果您想保护游戏对象,可以使用该功能

DontDestroyOnLoad(gameObject);

需要注意的是,当你说:this.gameObject时,你指向的几乎是同一个东西,只是碰巧this直接指向附加到该游戏对象的脚本。所以你不需要this部分,只需要gameObject就可以了。

理想情况下,您可以在void Awake() 中保护该游戏对象

void Awake()
{
   DontDestroyOnLoad(gameObject);
}

上面的代码将防止Unity破坏该gameObject,除非你的游戏完全关闭,或者稍后你对其调用Destroy()。这意味着你可以从一个场景切换到另一个场景,gameObject将存活下来。但是,如果你回到创建你正在保护的游戏对象的场景,如果你没有实现阻止你保护第二个、第三个或许多游戏对象的逻辑,你可能会遇到问题。

如果我理解正确,您的第二个问题:你想在改变场景时发送邮件,但你的进度条在改变场景的时候不会进展,它只是保持不变。

如果是这样的话,那么你的问题就出在Application.LoadLevel(sceneName);上。如果你有免费版本的Unity,那么你需要想出自己的创意来显示进度条,因为Application.LoadLevel()会停止一切,直到它把你带到新的场景。

我不完全理解你在说什么。但是,因为在您的上下文中,中的this很可能代表Monobehaviour,请尝试以下操作:

void Awake() {
    DontDestroyOnLoad(this.gameObject);
}

void Awake() {
   DontDestroyOnLoad(gameObject);
}

请参阅http://docs.unity3d.com/Documentation/ScriptReference/Object.DontDestroyOnLoad.html

我建议您使用带有"yield"语句的协程查看WWW类的文档,它同样涉及到编写代码来处理等待来自web的响应,而无需挂起Unity3d程序

如果您处理的任务需要超过一两帧的时间,那么协同程序是非常强大的。Richard Fine(AltDevBlog)发布了一篇关于它们是什么以及如何使用它们的非常详细的描述,我非常推荐。