头图

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


侑虎科技
65 声望22 粉丝

UWA官网:[链接]