ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Unity游戏上架微信小游戏:适配全程与避坑实录

Unity游戏上架微信小游戏:适配全程与避坑实录

Unity游戏上架微信小游戏:适配全程与避坑实录

【免费下载链接】minigame-unity-webgl-transform微信小游戏Unity引擎适配器文档。项目地址: https://gitcode.com/GitHub_Trending/mi/minigame-unity-webgl-transform

把一个跑在手游端的 Unity 项目搬进微信小游戏,第一反应往往是"导出个 WebGL 就行了"。真做下来才发现三个硬门槛:内存有硬顶(2GB 运存的老 iPhone 说 OOM 就 OOM)、启动时长敏感(普通小游戏 7~10 秒,不优化的 Unity 包能到 20 秒以上,用户直接划走)、平台能力缺失(登录、好友排行、支付都要自己搭桥)。官方维护的 minigame-unity-webgl-transform 适配方案,用转换工具解决前两个问题,再用 C# SDK 把微信接口封装成 Unity 能直接调用的形式。下面按实战顺序讲一遍流程和坑。

快速上手:环境核对与第一次跑通

先对三样东西:

  1. 引擎版本:方案兼容 Unity 2018~2022 各主版本,但没有验证过的小版本别用。推荐 2022.3(完整支持 DXT/ETC2/ASTC 压缩纹理,编译体积只有早期版本的 80%);条件允许直接上基于 2022.3.2 的团结引擎,内存和包体更小,还多一个 FrameDebugger。
  2. 微信开发者工具:必须下载 Stable 稳定版,别下"小游戏版 Minigame Build",插件兼容性会出问题。
  3. 账号:在 MP 公众平台注册小游戏类目应用,进"能力地图-生产提效包-快适配"开通插件权限,否则开发者工具里会一直报插件未授权。

跑通的步骤:

  • 通过 PackageManager(git 方式)或 UnityPackage 安装适配插件;
  • Build Settings 里选择 WebGL 平台,只勾选 Loading 场景,其余场景后续用 AssetBundle/Addressable 加载:

  • 顶部菜单"微信小游戏 → 转换小游戏",填写游戏 appid(勿用测试号)、游戏资源 CDN 地址、导出路径,点"生成并转换";
  • 产物是两个目录:minigame(小游戏项目)和webgl(Unity 导出的资源代码)。开发者工具导入的是minigame,导入根目录会报"找不到 game.json";
  • 开发者工具里预览,再点"预览"扫码真机验证。真机验证请走二维码,不要用工具里的"真机调试"功能。

CI 集成时不用手动点面板,调用WXEditorWindow的DoExport()即可脚本化导出。

内存压进限额:先搞清楚 1G 花在哪

官方给出的红线(超出就等着低端机闪退):

  • Android:低档机 < 1.2GB,中高档机 < 1.5GB
  • iOS:低档机 < 1GB,中高档机 < 1.4GB(低档机就是 iPhone 8 这类 2GB 运存)

拿 iOS 上一款 30MB 代码包的游戏算笔账:小游戏基础库 130MB + Canvas 画布 70MB +WASM 编译约 300MB+ UnityHeap + GPU 纹理 + 音频。编译这一项就吃掉快三分之一,所以压内存第一刀砍向代码体积:

  1. 转换面板勾选 Strip Engine Code,Managed Stripping Level 调 High,2021+ 可以把 IL2CPP 优化目标设为 size;目标代码包 ≤30MB;
  2. 上 WasmSplit 代码分包(微信开发者工具扩展里装 wasmCodeSplit 插件,见 代码分包文档)。它把 wasm 拆成启动主包 + 延迟子包,iOS 高性能模式下还能按函数粒度按需加载,编译内存可降 50% 以上:

  1. 纹理:2021 起的引擎直接开 ASTC/ETC2;老版本(2018~2020)必须走微信压缩纹理优化,否则 RGBA 纹理在显存里会膨胀好几倍。
  2. 两个反直觉的坑:Emscripten 文件系统会按文件同等大小占内存,所以别用首资源包直读、Addressable Cache、WWW.LoadFromCacheOrDownload这类缓存 API;长音频别让 FMOD 播,UnityAudio 会自动适配小游戏环境。

查内存不要靠感觉:转换面板勾 ProfilingMemory 后,游戏左上角性能面板能看 MonoHeap、NativeReserved 这些分项;要定位到具体分配调用,再上 ProfilingMemory 分析工具。

启动提速:把 20 秒压到 5~10 秒

启动耗时 = 首包下载 + wasm 下载编译 + 引擎初始化三段,玩家平均下载速度约 2MB/s,但有不少低于 300KB/s 的慢网用户,所以下载体积就是命:

  • 首包只放 Loading 场景。转换面板勾选"压缩首资源包",或在 CDN 侧对首资源包开 gzip/br,用开发者工具 Network 面板确认传输量压到 3~5MB;
  • 中文字体:WebGL 环境没有系统字体,中文显示必须自带字体文件,控制在 2~3MB 以内的精简字体,别把整包字体塞进首包;
  • wasm 段:转换工具自动做 br 压缩(能压到原 code 包的 20%),这块不用你操心,但你不要动 PlayerSettings 里的压缩选项,保持"不压缩",自己再压一次反而会启动失败;
  • 首帧逻辑:Loading 场景的 Start/Awake 只做最少的事,先出画面,配置加载、资源预取走分帧;等画面出来的网络空闲期用预下载功能把后续 Bundle 拉下来。

资源侧从首包剥离出去之后,建议整体切到 Addressable 或 AssetBundle 按需加载。仓库里 Addressable 示例工程的全局配置可以照着抄:GlobalSettings.cs。

这张图里几个勾选项直接对应上面的坑:压缩选 lz4、取消 Cache/Crc、分文件打包(Pack Separately)、失败重试 3 次。Cache 勾上就是内存双份,别手滑。

微信能力接入:登录、社交、开放数据域

平台能力以 C# SDK 提供,支持范围基本对齐官方 wx API。约定只有一条:主逻辑必须放在WX.InitSDK回调之后,SDK 没初始化完就调接口是静默失败的。

WX.InitSDK((int code) => { // code 非 0 表示登录失败,重试或提示 StartGame(); });

SDK 没显式封装的接口也别慌,WX.CallJSFunction("wx", "xxx", 参数对象)可以直调任意 wx API,比如分享到群。SDK 还有一批特供接口:开放数据域画布(ShowOpenData/HideOpenData)、本地缓存(StorageSetIntSync 等)、内存查询(GetTotalMemorySize,线上监控能直接用它上报)。

排行榜这类好友关系链数据走开放数据域,主域拿不到原始数据,只能画在子域 Canvas 里。做两件事:转换面板的 SDK 功能选项里勾选"使用好友关系链";如果最终没用到关系链,记得删掉game.json里plugins.Layout的配置,否则白占插件位:

出问题怎么定位:工具链排一排

调试链路和手游不一样,按这个顺序排:

  1. 看日志:真机上别用"真机调试",走工具"预览"扫码;需要 vconsole 时在game.js加wx.setEnableDebug({enableDebug: true}),或者右上角"..."-打开调试-重启小游戏。封面卡住打不开 vconsole 时,连点三次屏幕下方的 Unity logo;
  2. 看内存/帧:性能面板(提审包记得关)+ Unity Profiler,内存深查用 ProfilingMemory,逐帧 CPU 分析参考 Android CPU Profiler 文档;
  3. 还原堆栈:导出目录里的webgl.wasm.symbols.unityweb不上传到线上,但它专门用来解析报错堆栈,完整方法在 异常排查指南;
  4. 网络问题:PC 正常、Android 真机卡首屏,九成是域名没配——请求合法域名、跨域、SSL 证书三样逐条过,对照 网络通信适配 的注意事项。

避坑清单:这 5 个坑踩过的都懂

坑 1:中文显示方框,Editor 里却正常

  • 现象:真机/开发者工具里所有中文变豆腐块
  • 原因:WebGL 环境没有系统字体,中文必须来自字体文件
  • 解决:打一个 2~3MB 的精简字体进首资源包或 Bundle,别贪全字库

坑 2:改完压缩选项后启动直接失败

  • 现象:导出后开发者工具白屏,无明确报错
  • 原因:PlayerSettings 里把压缩改成了 brotli/gzip,和转换工具自动的 br 压缩冲突
  • 解决:压缩选项保持"不压缩",资源传输压缩交给 CDN 的 gzip/br

坑 3:Unable to load DLL xxx

  • 现象:启动即崩,堆栈指向某个 DLL
  • 原因:WebGL 不允许加载非源码编译的原生插件(System.Net、部分 lua 外部模块等)
  • 解决:换纯 C# 实现或 jslib 桥接,第三方插件逐个过一遍兼容性

坑 4:开发者工具正常,Android 真机卡首屏

  • 现象:PC 模拟器资源都能拉,真机停在 Loading
  • 原因:MP 后台没配 request 合法域名,或证书/跨域问题
  • 解决:按网络适配文档配好域名后重新预览,别怀疑代码

坑 5:黑屏 + 控制台刷 shader 编译错误

  • 现象:画面全黑,错误里出现 openGLES3.0
  • 原因:游戏依赖 WebGL2 特性,但默认导出是 WebGL1
  • 解决:导出选项里勾选 WebGL2 实验能力再转

写在最后

这套方案适合手里有 2018+ 版本 Unity 工程、愿意花一到两周做内存和启动优化的团队。不适合两类人:还停留在 Unity 5 时代不想升引擎的,以及期望"导出即上线、一行不改"的——红线摆在那里,省不了优化这一步。

【免费下载链接】minigame-unity-webgl-transform微信小游戏Unity引擎适配器文档。项目地址: https://gitcode.com/GitHub_Trending/mi/minigame-unity-webgl-transform

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进