首页 > 解决方案 > Unity 脚本从 .net 3.5 到 .net 4.0 静默失败

问题描述

今天我尝试将我的项目脚本运行时版本从使用 .net 3.5 等效更改为 .net 4.x 等效版本。从那时起,该项目一直存在各种问题。脚本随机失败。他们将执行某些功能或其他功能,但随后会在看似随机的点停止。他们失败的点在运行之间保持一致,但如果我编辑脚本可以改变。这些失败最奇怪的是控制台中没有产生错误。记录了一些错误,但只有在之后运行的某些代码依赖于前一个函数突然结束时未完成的某些事情时才会发生这种情况。我不知道是什么导致了这样的事情,我什至无法想出一个远程有用的谷歌搜索。恢复到 3.5 使问题消失,但看到 3。

我认为这可能是由于我在项目中使用的 SDK、Firebase 数据库和 Firebase Auth 引起的。

标签: .netfirebaseunity3dcallback

解决方案


有很多方法可以解决这个问题。我建议将您的异步代码转换为Unity 协程,然后编写CustomYieldInstruction或使用yield return new WaitUntil(()=>task.IsComplete);

我在这篇文章中详细介绍了这一点以及处理此过程的其他方法(async/await 很好,您可以将其中的每一个替换ContinueWith为,ContinueWithOnMainThread以使您的代码完全像以前一样工作)。

问题基本上是 Unity 3 中的 Firebase 使用一个名为“Parse”的库将 Task 对象改造成 Unity。它创建了一种动作队列,将任务分派到 Unity 线程的更新循环中。扩展方法ContinueWithOnMainThread完美地执行了这个逻辑。

现在,我为什么推荐 Coroutines 有点复杂。在 Unity 中,如果Destroy在 Unity 对象上调用,该对象的 C++ 位就会消失。如果您在任务运行时执行诸如更改场景之类的操作,这会产生一种与线程相关的问题的雷区。如果您切换到协程,如果拥有它的组件被清理并且您的逻辑始终在主线程上执行,则协程将无法继续。


推荐阅读