這是第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
點擊下方名片關注我們,將我設為星標,及時接收小編每日推送哦,性能優化不迷路~
近期精彩回顧
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.