1)在Unity转微信小游戏下,如何用Worker实现多线程
2)Unity的jslib库和微信小游戏的game.js如何互相调用函数或者通信
3)如何在Unity中实现资源的深度复制
这是第422篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。
UWA社区主页:community.uwa4d.com
UWA QQ群:793972859
Script
Q:想用WebWorker计算Unity里的小球的运动轨迹,请问Unity转微信小游戏的情况下,可以用Worker实现多线程吗?
A:可以参考官方文档:
Worker wx.createWorker(string scriptPath, object options)功能描述:
创建一个Worker线程。参数:
string scriptPath
Worker入口文件的绝对路径object options:
可选参数:
属性:useExperimentalWorker
类型:boolean
默认值:false
必填:否
说明:是否使用实验worker。在iOS下,实验worker的JS运行效率比非实验Worker提升数倍,如需在Worker内进行重度计算的建议开启此选项。同时,实验Worker存在极小概率会在系统资源紧张时被系统回收,因此建议配合worker.onProcessKilled事件使用,在Worker被回收后可重新创建一个。
最低版本:2.13.0返回值
Worker
Worker对象注意事项
- 接口使用前需要在game.json(插件为plugin.json)中配置workers字段,表示Worker代码根目录。
- scriptPath为入口文件的绝对路径,且不以/开头。
- 目前限制最多只能创建一个Worker,创建下一个Worker前请先调用Worker.terminate。
- 多线程Worker指南(小游戏)。
示例代码
// 创建普通worker wx.createWorker('workers/index.js')
function createNewWorker() { const worker = wx.createWorker('workers/index.js', { useExperimentalWorker: true }) // 监听worker被系统回收事件 worker.onProcessKilled(() => { // 重新创建一个worker createNewWorker() }) } // 创建实验worker createNewWorker()
官方文档链接:
https://developers.weixin.qq.com/minigame/dev/api/worker/wx.c...
感谢左君博@UWA问答社区提供了回答
Script
Q:做WebWorker的时候,打包出来的game.js和WebWorker成功通信上了,但是返回的结果不知道怎么还给Unity脚本,请问Unity可以调用的jslib库和打包出来的微信小游戏的game.js可以互相调用函数或者通信吗?
A1:可参考:自定义SDK调用
微信SDK提供了WX.CallJSFunction与WX.CallJSFunctionWithReturn接口实现了简单的第三方SDK调用,支持可序列化为JSON的任意数量的参数与返回值。其中,JS侧的实际调用逻辑为GameGlobal.sdkName.functionName(args),所以在调用之前需要保证SDK位于GameGlobal下且SDK中含有该名称的function。
在WX.CallJSFunctionWithReturn中,会将函数返回值转换为JSON后传回,若无返回值则传回""。
如需更加复杂的调用,可参考 WebGL:与浏览器脚本交互 进行自定义定制。
版本要求
转换插件 >= 202406062127代码示例
示例中的"sdk"、"testFunction"、TestFunctionOption仅作为演示,实际使用中请自行更改。WeChatWASM.WX.CallJSFunction("sdk", "testFunction", new TestFunctionOption { type = "text", text = "反馈", style = new OptionStyle() { left = 10, top = 10, width = 100, height = 100, backgroundColor = "#ff0000", color = "#ffffff", textAlign = "center", fontSize = 20, borderRadius = 10, lineHeight = 100, } });
另外,在js侧代码中合适位置添加以下代码,可配合构建模版能力使用。
GameGlobal["sdk"] = sdk;
官方文档链接:
https://wechat-miniprogram.github.io/minigame-unity-webgl-tra...自定义SDK调用
感谢袁梓民@UWA问答社区提供了回答
A2:可以使用SendMessage的方法。
感谢Hong@UWA问答社区提供了回答
A3:也可以使用moduleHelper.send方法,用反射调用和传参。
感谢左君博@UWA问答社区提供了回答
Asset
Q:请问一个预制(网格+材质+纹理) 复制一个新预制(网格+材质+纹理), 新的GUID和复制的GUID都需要不同,如何才能做到?
针对以上问题,有经验的朋友欢迎转至社区交流:
https://answer.uwa4d.com/question/67c5539a3d306f3e9d594e68
封面图来源于网络
今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。
UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。