这是第422篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com

本期目录:

  • 在Unity转微信小游戏下,如何用Worker实现多线程
  • Unity的jslib库和微信小游戏的game.js如何互相调用函数或者通信
  • 如何在Unity中实现资源的深度复制

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.createWorker.html

感谢左君博@UWA问答社区提供了回答欢迎大家转至社区交流

https://answer.uwa4d.com/question/67c559603d306f3e9d594e69

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-transform/Design/CustomSDK.html#自定义SDK调用

感谢袁梓民@UWA问答社区提供了回答

A2:可以使用SendMessage的方法。

感谢Hong@UWA问答社区提供了回答

A3:也可以使用moduleHelper.send方法,用反射调用和传参。

感谢左君博@UWA问答社区提供了回答欢迎大家转至社区交流

https://answer.uwa4d.com/question/67c55a77682c7e5cd61bfa0e

Asset

Q:请问一个预制(网格+材质+纹理) 复制一个新预制(网格+材质+纹理), 新的GUID和复制的GUID都需要不同,如何才能做到?

针对以上问题,有经验的朋友欢迎转至社区交流:

https://answer.uwa4d.com/question/67c5539a3d306f3e9d594e68

封面图来源于网络

今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com

UWA社区:community.uwa4d.com

UWA学堂:edu.uwa4d.com

点击下方名片关注我们,将我设为星标,及时接收小编每日推送哦,性能优化不迷路~

近期精彩回顾