Unity 解决 “... can only be called from the main thread” 问题

这篇具有很好参考价值的文章主要介绍了Unity 解决 “... can only be called from the main thread” 问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

有些属性或方法只能在主线程中调用,如 .gameObjectInstantiate() 等。这是 Unity 设计时的一个缺陷(为了保证线程安全),多年来一直没有修正,或者说官方懒得弄。

Instantiate() 为例,在非主线程调用时,报错大概如下所示。其他属性或方法的报错也大体相同。

UnityEngine.UnityException: Internal_CloneSingle can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
  at (wrapper managed-to-native) UnityEngine.Object.Internal_CloneSingle(UnityEngine.Object)
  at UnityEngine.Object.Instantiate[T] (T original) [0x00012] in <25586dd8e41845059c446f7ba2bf37e4>:0 
  at ... (...) [0x0000a] in ... .cs:... 
UnityEngine.Debug:Log (object)

注:应注意,此问题在有些情况下 Unity 控制台不会提示任何错误,只是代码会在那里中断,这时可能会让人非常摸不着头脑。使用 try { } catch (Exception e) { Debug.Log(e); } 才能在控制台中显示出错误,以便验证是不是本文所述问题。

解决方法

使用第三方包:https://github.com/PimDeWitte/UnityMainThreadDispatcher.git

步骤 1

导入包:

  • 在 Unity 中,Window -> Package Manager -> 加号 -> Add package from git URL,输入上面的仓库地址,Add。

或者:

  • 修改 Packages\manifest.json,在 dependencies 中加入一行:
"dependencies": {
  "com.pimdewitte.unitymainthreaddispatcher": "https://github.com/PimDeWitte/UnityMainThreadDispatcher.git",
}

步骤 2

在场景内创建一个空物体,挂载 UnityMainThreadDispatcher 组件。

步骤 3

在你的代码中,按照下面的方法调用原来出问题的语句,问题解决。

普通:

UnityMainThreadDispatcher.Instance().Enqueue(() =>
{
    // 只能在主线程执行的语句
    // ...
});

协程:文章来源地址https://www.toymoban.com/news/detail-799142.html

private IEnumerator Do()
{
    // 只能在主线程执行的语句
    // ...
    yield return null;
}

private void Fun()
{
    UnityMainThreadDispatcher.Instance().Enqueue(Do());
}

参考资料

  1. https://forum.unity.com/threads/working-with-threads-can-only-be-called-from-the-main-thread.513899/#post-7779918
  2. https://github.com/PimDeWitte/UnityMainThreadDispatcher

到了这里,关于Unity 解决 “... can only be called from the main thread” 问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决only one element tensors can be converted to Python scalars

    目录 解决 \\\"only one element tensors can be converted to Python scalars\\\" 错误 问题源头 解决方法 方法一:使用​​item()​​方法 方法二:使用索引操作 总结 语法 参数 返回值 使用场景 示例 当我们使用PyTorch进行深度学习任务时,有时会遇到以下错误信息:\\\"only one element tensors can be conve

    2024年02月03日
    浏览(47)
  • 解决TypeError: only size-1 arrays can be converted to Python scalars

    目录 解决TypeError: only size-1 arrays can be converted to Python scalars 错误示例 错误分析 解决方法 方法一:使用​​flatten()​​ 方法二:使用ravel() 结论 在Python中,当我们尝试将一个数组作为标量(scalar)进行操作时,有时会遇到 ​ ​TypeError: only size-1 arrays can be converted to Python sca

    2024年02月05日
    浏览(50)
  • Vue CLI系列之Syntax Error: Thread Loader (Worker 4) The “from“ argument must be of type string. Receive

    Syntax Error: Thread Loader (Worker 4) The “from” argument must be of type string. Received undefined vue-cli 使用 wokrer-loader 加载 web woker 时,使用 npm run build 有很大机率会打包失败,报错如上。 thread-loader 与worker-loader有冲突。 vue.config.js 配置 parallel: false 。构建正式环境关闭thread-loader。 如果你感

    2024年02月15日
    浏览(45)
  • 微信小程序:requestSubscribeMessage:fail can only be invoked by user TAP gesture的问题

    wx.requestSubscribeMessage(Object object) 发生`requestSubscribeMessage:fail can only be invoked by user TAP gesture`错误提示的原因主要是: 2.8.2版本开始, 用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面 。 也就是说通过其他方式去拉起订阅都是不成功的。 调起客户端小程序订阅

    2024年02月13日
    浏览(38)
  • vue/cli@4执行npm run build报错:Syntax Error: Thread Loader (Worker 2) The “from“ argument must be of

    目录 1、问题 2、原因 3、解决方案 Syntax Error: Thread Loader (Work 2) The \\\"from\\\" argument must be of type string. Received undefined 语法错误:线程加载器(工作2) “from”参数的类型必须为字符串。接收未定义 错误提示代码: vue-cli 使用 wokrer-loader 加载 web woker 时,使用 npm run build 有很大机

    2024年02月09日
    浏览(55)
  • Wireshark报错 Info can only be sorted with 10000 or fewer visible rows——解决办法

    使用info筛选出Query和Response数据包时,报错: Info can only be sorted with 10000 or fewer visible rows; increase cache size in Layout preferences 。 这通常是因为Wireshark的缓存大小设置不够大,导致无法处理大量数据。  在菜单栏中选择“Edit”(编辑) - “Preferences”(首选项)。 选择外观,布局

    2024年03月19日
    浏览(52)
  • 【解决】ScriptableObject.ctor is not allowed to be called from a MonoBehaviour constructor...

    开发平台:Unity 2018版本 编程平台:Visual Studio 2018版本 编程语言:CSharp   描述 原文 ScriptableObject.ctor is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead. Called from MonoBehaviour ‘脚本名称’ on game object ‘游戏对象名称’.See “Scrip

    2024年02月15日
    浏览(61)
  • 【小程序】fail can only be invoked by user TAP gesture 唤起订阅消息多端兼容解决方案

    在对接消息订阅功能时,出现了调用 uni.requestSubscribeMessage 后无法唤起订阅消息窗口的情况。 uni.requestSubscribeMessage 之前存在异步逻辑时无法唤起,但是在 uni.showModal 的回调中调用时可以唤起。 抖音小程序中 uni.requestSubscribeMessage 事件必须手动点击直接触发,不能在回调中触发

    2024年02月16日
    浏览(46)
  • 解决File ~ could only be written to 0 of the 1 minReplication nodes.

    在通过javaApi上传本地文件时出现以下错误,主要原因是: File /test3.txt could only be written to 0 of the 1 minReplication nodes. There are 1 datanode(s) running and 1 node(s) are excluded in this operation. 但是之前还能解决向hdfs创建目录,为什么不能上传文件嘞?按理说权限不应该有问题,那具体是什么

    2023年04月08日
    浏览(78)
  • 解决The Node,js path can contain only letters, digits, periods (), underscores ( ), hyphens (-), colon

    安装 HUAWEI DevEco Studio 后配置 Node.js 环境时可能会报: The Node,js path can contain only letters, digits, periods (), underscores ( ), hyphens (-), colon () and backslash () 原因可能是因为安装路径中包含了 空格 ,可能大部分人习惯将软件安装在 Program Files 目录下,此时只要将 nodejs 的安装目录移到根

    2024年04月12日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包