背景:
将unity游戏转换到微信小游戏,对应的 SDK也要配套开发,周期短,c# 知识储备不多,还有后期的维护能力的缺失。
选型:
虽然微信提供了 c# 版本的 SDK,但是前期我们的 jssdk 承载了我们大量的业务,所以我们希望能够复用我们 jssdk 的能力,同时又要最小成本以及最快速度迁移到 c# 这边 ,这是微信官方的 C# Sdk 为了我们思路,桥接。
需要明白一点的是,unity 转 小游戏,并不是 c# 转成了 js,而是 c# 被编译后运行于 webassembly 之中。
原理
说好了桥接,就是要打通 js 跟 c# 之间的双端通信。
1.对于 c# 调用 js, unity 官方是通过 jslib 文件暴露 js 对象接口,而 js 对象里面的方法去调用 js 环境的全局对象,微信是 gameglobal, 但是也可以在jslib中通过window 调用挂载到 gameglobal的对象,这是从 微信官方 c# sdk 发现的彩蛋? 2. 而 js如果需要调用 c# 那边的代码,unity 官方 是说从新建一个gameobject,然后调用这个实例的方法,而微信 c# sdk 也是这么做的。这就解决了js 到 c# 这边通信的问题。
但是,解决通信只是第一步,形参、返回值、同步异步,全排列组合就是8种类型的函数类型才能满足我们的需求,同步异步来说, 各自的回调肯定是通过存储回调池,然后通信的时候把回调池生成的id 序列化传到对面,形参,也是基本都是要序列化传递,返回值这块,需要调用 unity一些方法把值格式化一遍,还有回调的调用,序列化过来的值都要反序列过来,有个jsonunity的方法。
微信这边提供的转小游戏的插件,说白了,就是把 c# 代码编译到wasm,jslib 编译到 js,把template 里面的模板进行目录搬迁以及参数替换,同时还生成了一个webgl h5版本,那个版本的wx sdk 都是mock的,哈哈哈。
调用 js sdk的方案,这里还把回调函数的匿名id 序列化了
暴露给 jslib的全局方法,调用 微信js sdk 的登录 ,生成的登录回调 跟 c# 通信
生成占位符回调方法
跟 c# 通信
js 调用的 c# 代码
c# 的回调池存储类
打完收工
作为工作记录