.net - Unity 脚本从 .net 3.5 到 .net 4.0 静默失败
问题描述
今天我尝试将我的项目脚本运行时版本从使用 .net 3.5 等效更改为 .net 4.x 等效版本。从那时起,该项目一直存在各种问题。脚本随机失败。他们将执行某些功能或其他功能,但随后会在看似随机的点停止。他们失败的点在运行之间保持一致,但如果我编辑脚本可以改变。这些失败最奇怪的是控制台中没有产生错误。记录了一些错误,但只有在之后运行的某些代码依赖于前一个函数突然结束时未完成的某些事情时才会发生这种情况。我不知道是什么导致了这样的事情,我什至无法想出一个远程有用的谷歌搜索。恢复到 3.5 使问题消失,但看到 3。
我认为这可能是由于我在项目中使用的 SDK、Firebase 数据库和 Firebase Auth 引起的。
解决方案
有很多方法可以解决这个问题。我建议将您的异步代码转换为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++ 位就会消失。如果您在任务运行时执行诸如更改场景之类的操作,这会产生一种与线程相关的问题的雷区。如果您切换到协程,如果拥有它的组件被清理并且您的逻辑始终在主线程上执行,则协程将无法继续。
推荐阅读
- azure-ad-b2c - 使用 Graph API 删除 B2C 用户 - 权限不足,无法完成操作
- javascript - JSON 数组,javascript 计数
- python - 是否可以重新创建一个从 Django 模型中意外删除的表字段,而无需拆除所有迁移?
- cron - 如何设置多个 cron 作业以每 30 分钟运行一次脚本但延迟 3 或 4 分钟?
- entity-framework-core - Blazor 服务器 EF Core 取消
- angular - 页面重新加载后数组变得未定义
- shell - 如何在没有 Ohmyzsh 的情况下获得不区分大小写的完成?
- docker - 我们可以更改 Kubernetes 镜像注册表搜索列表吗?
- c# - WPF DataTrigger 动画只触发一次
- typo3 - 包含 tt_content 子项的自定义内容元素的后端布局和拖放 | 打字稿3 11