拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Unity转微信小游戏个人开发者上手指南:从WebGL构建到免版号上架全流程

从Unity项目到微信小游戏正式上线在没有公司主体、没有备案域名、也没有版号的情况下我把整个发布链路完整走通了。前后断断续续折腾了大概两周真正花在写代码和调渲染上的时间其实不多大量时间消耗在搞懂平台规则、组件版本和审核材料的衔接上。如果你和我一样是个人开发者手头有一个Unity成品或Demo想把它塞进微信小游戏里这篇文章可以直接当操作清单用。我会按“先判资格、再定方案、然后改工程、最后提审”的顺序聊中间把我实际踩过的坑全部标出来。1. 个人主体到底能不能免版号边界和连带限制先给结论在微信公众平台当前的审核规则下个人主体是可以发布小游戏的并且部分品类不强制要求提供版号。但这个“免版号”不是无条件的它绑定在几个很具体的限制上其中一个条件不满足审核意见里就可能出现“请补充版号资质”之类的提示。我实测下来的边界大概是这样游戏不能开通虚拟支付不能有充值、内购、道具购买甚至不能有“金币兑换实物”这类变相支付玩法玩法尽量是纯单机休闲、工具类弱联网或无联网不要做棋牌、捕鱼、彩票等强监管细分不要涉及UGC内容传播也就是不能让玩家任意发布文字、图片给其他用户看提审时按平台要求提交软著证书或承诺性材料个人开发者建议提前办一个软件著作权登记费用不高能显著提升过审概率。这不是我一家之言个人开发者圈子里能稳定上线的Unity小游戏绝大多数都是“休闲玩法 无内购 单机”这个形态。反过来说如果你做的是抽卡养成、付费订阅、陌生人社交那不管主体是个人还是公司审核都会卡得很严。很多人在这一步想歪了游戏是挺好的但加了付费系统又不肯注册公司最后当然上不了架。再补一个最常见的认知误区小程序和小游戏的账号体系在微信公众平台上是分开的。小游戏必须从“小游戏”入口注册不能从“小程序”入口注册游戏类目否则审核时会被直接告知“该类目暂不支持发布游戏内容”。我见过好几个新手卡在这里以为是版号问题其实是选错了账号类型。个人主体注册小游戏不需要对公账户打款也不需要企业资质手机号身份证扫脸实名就能完成整个认证流程一般十几分钟就结束。个人主体和企业主体的差异我整理了一张表方便你判断自己适合走哪条路对比项个人主体企业主体注册成本身份证手机号即可需要营业执照、对公账户验证虚拟支付不支持支持需额外开通对应类目流量主/广告满足UV门槛后开通满足UV门槛后开通版号要求部分休闲品类不强制材料要求更高商业化游戏通常需要版号类目选择偏休闲、工具、教育覆盖面更广审核严格度相对更谨慎规则相同所以我这篇的思路是个人主体 免费游戏 休闲玩法走“免版号”发布路线。如果你的目标是从游戏里赚充值收入那这篇文章只能帮你完成技术接入商业化另一套玩法不在讨论范围内。2. Unity转微信小游戏的技术选型为什么绕不开WebGL这层有一点得先掰清楚Unity不能直接编译出一个“微信小游戏原生格式”的产物。微信小游戏的运行时环境是JavaScript WebAssemblyUnity里的C#代码没法直接跑在这个运行时上所以目前所有主流路线都绕不开Unity WebGL。你可以把微信小游戏理解成一个“带微信API的浏览器”而Unity WebGL是“跑在浏览器里的Unity应用”。两者之间需要一层适配层去处理生命周期、输入事件、云存储、截图等一系列平台差异。这层适配做得怎么样直接决定了你的游戏在微信里会不会白屏、闪退、内存爆掉。当时我对比了三条可行路线路线实现原理优点缺点用Cocos/Laya/微信原生小游戏引擎重写把Unity游戏逻辑翻译成JS/TS包体小、性能可控工作量取决于游戏复杂度基本上等于重做Unity WebGL 官方InstantGame适配包Unity构建WebGL再由InstantGame生成小游戏工程结构官方维护、跟随Unity版本更新、基础库兼容性好需要按小游戏运行环境调内存和启动参数Unity WebGL 社区转换插件早期第三方工具手工改game.js和适配代码灵活、可定制维护不稳定基础库升级后容易失效我最终选了官方InstantGame路线。原因很简单个人项目没有那么多精力去维护一整套自己改的适配层。社区插件在微信基础库每次大升级时都可能崩排查起来极其痛苦。官方包虽然也谈不上完美但至少Unity版本和微信基础库两边都在跟遇到问题社区案例也多。再说个很多人关心的点这套Unity WebGL产物不止能发微信小游戏。同一个工程把平台适配层换一下构建配置改成抖音小游戏的产物结构同样能上抖音小游戏。抖音那边有一个“侧边栏”入口能力属于平台提供的原生入口Unity这边不需要额外做什么只要确保WebGL构建适配抖音的基础库就行。如果你后续想把游戏同时发到微信和抖音建议从第一天就把代码里调用微信API的位置抽成一个独立管理器别散落在各个脚本里。技术选型确定后我当时的工程结构是这样规划的Unity版本选用2022.3 LTS不要用2023预览版WebGL工具链在LTS上最稳安装Unity时勾选WebGL Build Support模块不然后面构建会报找不到模块Package Manager里安装InstantGame包跟微信相关的API调用统一封装到一个PlatformAdapter脚本里方便以后接抖音。3. 发布前必须改掉的Unity工程参数内存、首包和兼容性如果你直接把一个做给安卓或PC跑的Unity项目切到WebGL导出大概率白屏、闪退或者加载到80%就停住。这不是代码写错了而是Unity工程里有一批参数在小游戏运行环境下必须调不调就是踩坑。3.1 Player Settings里最关键的几项我改完一遍后整理了一个最保守的参数表照着配基本不会出方向性问题配置项推荐值原因Scripting BackendIL2CPPWebGL只支持IL2CPPMono在此平台不可用Api Compatibility Level.NET Standard 2.1太高会带进大量不兼容API太低限制较多Graphics APIWebGL 2.0微信基础库对WebGL 2.0支持已经成熟Color SpaceLinear线性色彩空间避免UI颜色发灰Strip Engine Code勾选删除未使用引擎模块显著减小wasm体积Initial Memory Size256 MB左右太低启动崩溃太高低端安卓直接白屏Maximum Memory Size512~700 MB根据游戏实际内存曲线调Compression FormatBrotli体积最优但需要微信基础库版本支持不稳就换GzipSplash Screen关闭默认Unity启动动画在真机上体验差且拖慢首屏这里面的Memory参数我解释一下为什么网上说法这么乱。WebAssembly的内存模型和原生App不一样它不是像安卓那样动态扩展一点点而是启动时就给你分配一块连续内存。Initial Memory Size就是“起步内存”太小了Unity引擎初始化到一半就abort。Maximum Memory Size是“能涨到的上限”超过这个值同样直接崩。个人开发者在没有真实设备性能数据前先用256MB起步最高512MB然后在微信开发者工具里盯着内存曲线调比照抄任何配置都准。3.2 首包大小加载白屏的最大元凶微信小游戏对包体有明确限制而且限制比纯Web网页苛刻得多。如果你的Unity工程把全部资源都打进主包首包轻松超过40MB用户点进游戏会看到长时间进度条加载完又因为内存峰值过高闪退。我的处理办法是两层第一层启动场景瘦身。把启动场景里所有贴图、模型、音频都挪到AssetBundle里启动场景只保留一个最朴素的加载界面和一个空场景逻辑。等Unity引擎跑起来、微信环境初始化完再按需加载AB包里的场景资源。第二层资源压缩策略。纹理格式优先用ASTC或者ETC2音频用压缩率高的格式能合图就合图。3D模型网格能减面就减面个人项目里很多模型面数冗余得很严重减一半画质根本看不出来。首包控制在20MB以下之后加载速度会有一个肉眼可见的质变。微信开发者工具里也会提示“主包建议不超过20MB”虽然超了不一定失败但真机弱网环境下能不能顺利玩起来全看你包体做得够不够克制。3.3 插件兼容性那些在WebGL下必炸的东西这一章特别想提醒一件事凡是依赖原生代码的热更方案、Lua方案在Unity WebGL下基本都会炸。热搜词里有个“unity dllnotfoundexception: unable to load dll slua.”我身边真有同事踩过一模一样的坑。SLua的原理是运行时把C#和Lua脚本绑定起来底层依赖luajit的原生编译产物。WebGL平台没有Windows或安卓那个动态链接库模块构建出来自然报failed to load DLL slua。这个不是打包遗漏而是平台根本不提供原生DLL的加载通道属于原理性的不兼容。个人项目如果只是做活动配置表的动态更新不是重度热更玩法我建议直接放弃Lua方案把配置数据放到AB或者JSON资源里一样能实现“不改代码就更新数值”的需求。如果你的项目一定要用热更方案那Unity转微信小游戏这条路基本走不通得认真考虑换引擎或者接受“每次改逻辑都要重新过审核”的代价。除此之外还有几个容易忽略的兼容点网络库不要在Unity侧直接new WebSocket连自建服务器微信小游戏要求全部走合法域名和HTTPS/WSS并且域名要配置到后台白名单本地存储PlayerPrefs在小游戏环境是能用的微信会映射到本地缓存但频繁写入大对象会影响性能字体中文字体动辄几MB建议用动态字体或减少依赖系统字体渲染否则内存会额外多出一大截。4. 从注册到首次提审账号、工具和构建上传的操作链路工程参数调完之后剩下的就是一条流水线操作。这段我按自己实际跑通的顺序写每一步之间的依赖关系都标清楚照着走能少绕很多弯。4.1 注册小游戏账号打开微信公众平台注册时选择“小游戏”不要选“小程序”。主体类型选个人填手机号、身份证信息、扫码实名。个人主体不需要对公账户打款这一点比企业主体省事太多。注册完成后在“设置-基本设置”里找AppID这个后面Unity和微信开发者工具都要用。注意个人主体一个身份证可以注册好几个小游戏账号但我建议先用一个号跑通全流程不要一上来就把多个项目的AppID都创建了。因为后续每个AppID都要配置隐私指引、用户协议等一堆材料管理不过来反而容易漏。4.2 Unity环境准备Unity Hub里确认当前项目对应的Unity版本然后看模块列表里有没有WebGL Build Support。没有的话通过Unity Hub添加模块这一步是纯下载十几分钟到半小时不等跟网速有关。Package Manager窗口里搜索InstantGame并安装。不同Unity版本的InstantGame入口略有差异有的版本安装完菜单栏会出现Window - Instant Game有的版本在Build Profiles里直接能切。装完后打开Window - Instant Game按照面板提示创建Instant Game settingsBuild Target切到WebGL。如果你用的是2021.3或2022.3 LTS以上路径都是正常的。如果你还在用2019或2020建议先升级再到微信小游戏这一步老版本WebGL工具链的坑太多了不值得浪费时间。4.3 Unity构建产物长什么样选择Build Target为WebGL后在Instant Game设置正确的前提下点击Build输出目录里会多出一个微信小游戏工程结构。核心文件包括game.json小游戏配置包含页面、渲染模式、方向等信息game.js入口脚本Unity的wasm加载在这里被触发一堆.unityweb后缀的资源文件wasm、data、framework等适配层js文件负责生命周期、触摸事件、WebGL上下文初始化。这个目录就是后面要导入微信开发者工具的东西。构建过程中如果报错先看Console里的具体信息大部分问题还是Player Settings参数没调完或者某个插件在IL2CPP阶段编译失败。4.4 微信开发者工具导入、真机预览和调试下载微信开发者工具选择“小游戏”项目类型AppID填刚才注册的目录选择Unity构建产物所在的文件夹。首次导入后工具会提示“基础库版本”是否匹配。建议把调试基础库选到当前较新的稳定版本但也不要无脑追最新因为微信基础库大版本更新时有时会引入不兼容行为稳定压倒一切。导入完成后点编译如果一切正常模拟器里能看到Unity的启动画面并进入游戏。到这里还只是第一步真正能验证性能的是“真机预览”。点工具右上角的预览按钮会生成一个二维码手机微信扫码后会在真机上跑一遍小游戏。真机预览的表现和模拟器经常差异很大内存、加载速度、触摸响应都会不一样所以这一步省不得。如果真机上白屏或卡在加载进度优先看Console里的abort信息。出现“abort”说明WebAssembly内存不足或加载失败按前面3.1节的思路把Initial Memory Size调高一点或者反过来降低包体。4.5 上传版本并提交审核真机预览确认没问题后在微信开发者工具右上角点“上传”填入版本号和项目备注。上传成功后回到微信公众平台的管理后台找到“版本管理”把这个上传版本设为提审版本。提审时平台会要求填写版本描述、提交审核截图、配置隐私保护指引、补充用户协议。这些材料缺一不可第6章我会专门说怎么准备才能少被驳回。审核周期我个人遇到的是1~7个工作日不等首次提审通常更慢一些后面小版本迭代会快很多。审核期间不要反复撤回重提每一次撤回都会把排位重置反而更慢。5. 好友排行榜不是“调一个接口”开放数据域和Unity的隔离关系很多Unity开发者听都没听过“开放数据域”一上来就打算在C#里直接调wx.getFriendCloudStorage拉好友分数。我第一次也是这么想的结果查了文档才发现完全不是一回事。微信为了用户隐私安全做了隔离关系链数据也就是好友列表、好友分数一律不允许直接暴露给游戏主域。主域就是Unity跑的那一层它只知道“当前玩家自己”的数据拿不到好友维度的数据。所有关系链操作必须在“开放数据域”里完成。开放数据域听起来高大上其实就是一个独立于Unity工程之外的JS小游戏工程。它和主域各跑各的两者之间唯一的“物理通道”是一个共享Canvas对象官方叫sharedCanvas。5.1 完整的排行榜数据流我把整个流程拆成四步这样理解起来不绕主域Unity在玩家游戏结束后调用wx.setUserCloudStorage把当前分数写入微信自带的KV云存储开放数据域里调用wx.getFriendCloudStorage读取当前玩家好友的分数数据开放数据域把这些分数排序用Canvas API画成一个排行榜界面绘制结果输出到sharedCanvas主域Unity拿到sharedCanvas把它作为纹理贴到Unity UI的RawImage上玩家就能在游戏里看到排行榜。这个架构特别反直觉的地方在于排行榜的UI逻辑不能写在Unity里而是写在开放数据域那个JS工程里。Unity这边只负责“展示一张来自外部Canvas的纹理”。5.2 实操层面大概长什么样开放数据域里配置independent真个入口后在独立的game.js里面代码思路大致如下// 开放数据域 game.js // 读取好友分数数据 wx.getFriendCloudStorage({ keyList: [score], success: (res) { const data res.data.map(item { const kv item.KVDataList.find(k k.key score); return { nickname: item.nickname, avatarUrl: item.avatarUrl, score: kv ? JSON.parse(kv.value).score : 0 }; }); data.sort((a, b) b.score - a.score); drawRankList(data); // 用Canvas API把榜单画到sharedCanvas上 } });主域Unity侧需要拿到sharedCanvas并转成纹理更新UI// 思路级示例接口名以当前基础库为准 #if UNITY_WEBGL !UNITY_EDITOR private Texture2D rankTexture; private void UpdateRankTexture() { var canvas WeChatWASM.WX.GetSharedCanvas(); // 将 canvas 数据填入 Texture2D再赋给 RawImage } #endif这块代码不同项目的封装方式差别很大我只给一个思路级骨架。真正落地时要注意的点是sharedCanvas的尺寸要和Unity UI上显示尺寸匹配否则会出现排行榜界面被拉伸模糊的问题。低端安卓机上的Canvas绘制频率也要控制每秒更新一次足够不要每帧都重绘。5.3 如果不想碰关系链数据好友排行榜看起来诱人但开放数据域的学习成本和适配成本都不小。我后来做了一个更轻量级的方案自建一个排行榜后端玩家之间按“挑战同一关卡”来排名分数直接提交到服务器大家看到的是全服排行而不是微信好友排行。这个方案的好处是彻底绕开了开放数据域Unity里直接用HTTP请求拉分数列表就行。缺点是缺少“和好友比”的社交归属感对裂变传播帮助有限。如果你做的是休闲小游戏我建议先用轻量方案上线跑通后再加开放数据域的微信好友排行。6. 我实际踩过的审核驳回点截图、隐私弹窗和广告位游戏技术上能跑起来只是第一步提交审核才是个人开发者最头疼的环节。这一章我按自己的真实经历把最容易导致驳回的几个点列出来每条都附上了根因和解决方式。驳回现象根因解决方式审核意见提到“涉及游戏内容请补充相关资质”类目选错或游戏内容撞上强管控品类确认注册的是小游戏账号类目选休闲游戏内去掉付费/抽奖打开首屏没有隐私弹窗未配置隐私保护指引在小游戏后台配置隐私保护指引并在代码里调用隐私弹窗组件加载到一半白屏/真机闪退首包过大或内存参数不合理压缩首包按第3章调整内存参数审核反馈“存在诱导分享”分享按钮绑定奖励太直接把分享奖励改成不影响核心玩法的外观奖励减少强制诱导激励视频广告“诱导点击”广告位覆盖核心UI或频繁弹出广告按钮缩小触发频率降低版本描述不清晰提审材料乱填写清楚版本改动了什么、新增了什么场景审核员判断更快里面最容易忽略的其实是隐私保护指引。现在微信小游戏对隐私合规查得越来越严只要游戏里调用了用户数据接口哪怕只是wx.setUserCloudStorage一个设置分数的调用都必须提前在后台配置“收集的信息类型、用途、隐私政策链接”。首次提审时漏掉这一项基本都会被驳回。提审截图这块也别随便截两张完事。平台通常要求竖屏/横屏各若干张截图里尽量展示真实玩法界面。最忌讳把“开发中界面”“未完成UI”传上去审核员看不懂游戏在玩什么驳回概率飙升。广告位是个很容易被忽略的细节。个人开发者没有虚拟支付想变现基本只能靠流量主广告。流量主开通有个UV门槛但提审时更需要注意的是广告位的交互设计。激励视频的按钮不要做成满屏闪烁的“大金币”要和核心玩法有明确区分广告弹窗不能每局都强制弹频率太高会被判“诱导点击”。我踩过一次亏第一版广告按钮做得太醒目审核驳回理由是“广告影响正常游戏体验”改小按钮之后才过。除了以上技术性驳回点还有一类“软性”驳回审核员认为游戏内容存在侵权风险。画面素材、字体、音乐任何一个来源不明的资源都可能成为驳回理由。个人开发者最容易踩的是字体随便使用一款商业字体游戏里所有文字渲染都会触碰版权问题。建议用开源字体或者确认商用授权的字体图片和音乐同理。身份材料上个人主体提审时如果没有软著证书有些品类会要求补充承诺材料。我的建议是不要拖提前去办理软件著作权登记周期大概1~2个月虽然时间久但办了之后几乎不会因为资质材料被卡。如果你急着上线至少先把承诺材料准备着后续补交软著。版本迭代这块微信小游戏有“体验版”机制提审前可以生成一个体验版链接发给几十个好友先测。个人开发者没有专门的测试团队这个环节特别有用。我每次发版前都会让5~10个不同型号手机的人跑一遍真机预览安卓低端机、iPhone老机型各覆盖一些能提前暴露大部分兼容性问题。走完这一圈我最深的体会是个人开发者做Unity微信小游戏引擎侧的改造其实只占三成工作量剩下七成全在平台规则、工程裁剪和审核材料上。很多人卡在“技术上做好了但上不了线”根源不是Unity能力不够而是没有把平台对个人主体的限制想清楚。如果让我再走一遍我会一开始就把微信和抖音的账号都注册好Unity工程里把平台SDK层抽干净同一套代码适配两端。抖音侧边栏那个入口能力在休闲游戏上拉新效果不错Unity构建侧不需要特殊处理主要是抖音开放平台的配置和基础库兼容问题。最后分享一个小技巧提审前用微信开发者工具打开性能面板跑一遍完整的游戏流程重点看内存曲线和drawcall。小游戏环境不像原生App有那么多调优手段内存曲线能平稳、首包加载不白屏、真机帧率稳定在30以上过审上架基本是板上钉钉的事。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门