免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Unity微信小游戏免版号发布全流程:个人主体从打包到上线

Unity微信小游戏免版号发布全流程:个人主体从打包到上线 免版号这三个字在Unity开发者圈子里基本等于“小游戏变现合法化的最后一道门槛”。很多人花了几周时间把游戏逻辑用Unity撸完结果卡在主体资质、软著、版号这一连串行政流程上项目直接凉在仓库里。我自己的几个个人项目包括一个模拟经营类的工具型小游戏、一个给教育机构做的互动课件都翻过了这道墙走通了“个人主体 Unity 微信小游戏平台”的完整链路而且全程没有碰版号。这篇东西就把我踩过的坑、查过的规则、改过的代码一次性整理出来给打算用Unity做微信小游戏、又不想被版号卡死的朋友一条能直接照抄的路。先说结论个人主体能不能做微信小游戏能。要不要版号取决于你选的类目和玩法定义。我接下来要讲的是“免版号”这一支的完整接入发布流程涵盖账号注册、类目选择、Unity打包适配、微信SDK接入、提审上线以及我在真实项目里碰到的一堆乱七八糟的报错和它们的解法。1. 先说清楚个人主体为什么能“免版号”1.1 平台规则里被忽略的灰度地带微信小游戏平台目前对个人主体开放注册这一点很多做Unity的人不知道。大家默认小游戏必须企业主体、必须软著、必须版号其实不全对。平台把产品分成两大类一类是“游戏”类目这类确实需要版号、软著等一堆资质另一类是“非游戏”类目比如教育、工具、医疗、商业服务等只要你的产品逻辑不往“娱乐游戏”上靠个人主体就能直接发布不需要版号。换句话说你完全可以把Unity开发的交互动画、模拟实验、学习工具、产品展示、计算器、绘图板这类东西包装成小程序底层跑的还是Unity的WebGL渲染交互体验和游戏几乎一样但类目走的是“工具”或“教育”审核就好过得多。我那个模拟经营项目为什么能免版号因为它核心玩法是“资源分配与数值规划”我把它定位成“效率工具”所有的UI文案、引导提示都往工具属性上靠审核一次就过了。1.2 什么样的Unity项目适合走这条路不是所有游戏都能硬蹭“工具”类目。判定标准其实很透明你的应用有没有主动、持续的娱乐反馈循环。如果核心玩法是跳跃、射击、消除这类强娱乐反馈那不管你怎么包装审核大概率会打回。反过来如果核心是输入—处理—输出比如用户拖动参数、观察结果变化这类就更接近工具个人主体可以做。我自己总结了一个筛选模型拿你的Unity项目对照一下有明确输入输出关系用户操作产生可预测的结果而不是随机反馈。使用场景可以描述成“完成某个真实任务”比如学习、测量、规划、演示。没有积分、关卡、生命值这类强游戏化机制就算有也是辅助性的不构成核心循环。如果你的项目符合上面两条以上那“免版号”这个路径就完全走得通。下面所有流程我都按这个前提来讲。2. 账号与类目第一步错后面全白搭2.1 个人主体注册与AppID申请微信公众平台的注册流程我试了不止一次帮朋友也弄过好几个细节其实不难但特别容易卡在身份验证上。打开微信公众平台官网选“小程序”注册主体类型选“个人”。这里要注意一个身份证只能注册一个小程序账号所以别浪费名额想清楚再注册。注册过程中需要管理员微信扫码绑定还要做实名验证整个过程大概十几分钟。注册完进入后台在“开发—开发设置”里可以看到AppID。这个AppID就是后面Unity打包和微信开发者工具要用到的唯一标识复制保存好。小程序的AppID不像游戏类目那样有额外的资质门槛个人主体直接就有。还有个小技巧注册时类目可以先随便选一个因为类目审核是在发布提审阶段才严格校验的。但我不建议这么干最好一开始就按你计划发布的类目去选省得后面改类目触发重新审核。2.2 类目选择是免版号的关键一步类目选择是整个流程里最核心的一步。微信小程序后台的类目列表里个人主体能选的范围其实挺大包括“工具—效率”“工具—教育”“教育—教育信息服务”“商业服务—企业管理”等。我自己的项目选的是“工具—效率”我朋友的互动课件选的是“教育—教育信息服务”都顺利过了。选类目的时候注意两件事第一类目名称和你的产品描述要自洽。如果你的应用叫“XX模拟器”类目偏偏选“商业服务”那审核员大概率会怀疑你在挂羊头卖狗肉。我叫“资源规划工作台”类目选“工具—效率”整个链路就顺了。第二不要勾选任何跟“游戏”相关的服务条款。微信小游戏平台有一个独立的“小游戏”入口注册时如果你选了“小游戏”类型后面就强制走游戏资质审查。一定要确保注册的是“小程序”不是“小游戏”。Unity项目跑在小程序壳子里和注册类型是两码事这个逻辑很多人搞混。3. Unity工程改造从PC/移动端到微信小游戏的适配之路3.1 工具链选型Unity版本、转换插件、微信开发者工具敲定账号之后开始技术侧。Unity版本上我建议用2021 LTS或2022 LTS这两个版本对WebGL的支持最稳定。我自己用的是Unity 2022.3.20f1配微信官方提供的minigame-unity-webgl-transform插件也就是网上常说的“Unity微信小游戏适配方案”。这套方案的原理简单说就是把Unity的WebGL导出产物再转换成微信小游戏能识别的代码结构和资源包生成的JS代码跑在微信的JavaScript引擎里Unity的渲染则通过WebGL接口输出到小游戏Canvas上。整个过程听起来复杂实际操作就是装插件、改几个配置、点构建。工具链上还需要装好Unity Hub和对应版本的Unity编辑器Node.js用于跑转换脚本推荐LTS版本微信开发者工具稳定版就行用于预览、调试、上传minigame-unity-webgl-transform插件从GitHub或者Unity官方渠道拉最新版3.2 工程配置Player Settings里的关键开关在Unity里把平台切换到WebGL然后打开Player Settings这一块有几个关键设置我每次做新项目都会核对一遍。第一个是Resolution。小游戏在手机上跑分辨率设置成自适应就好不然不同机型会出现拉伸变形。我一般把Default Canvas Width设成竖屏750或者横屏1334具体看产品方向。还要勾选“Resizing窗口自适应”保证微信里动态调整大小时画面不错位。第二个是Compression Format建议选Brotli压缩率高小游戏加载速度会快不少。但注意Brotli压缩在某些低版本微信内核上有兼容性问题如果测试发现白屏可以退回Gzip。第三个是Auto Graphics API先确认是WebGL 2.0优先。微信小游戏底层的WebGL 2.0支持已经很完善了但有些老设备只支持WebGL 1.0所以不要关闭Fallback。如果项目里用了URP或者HDRP的某些高级特性在WebGL下会有兼容性坑我自己的项目用的是Built-in管线稳。还有个高频问题就是热词里出现的“no valid unity editor license found”这个是Unity个人版激活问题。你只要打开Unity Hub登录账号确认许可证是激活状态就行。如果你用的是2022.3之后版本有时候更新许可证会抽风重登一下就好。3.3 代码层适配从C#到微信API的桥接Unity里写好的C#代码大部分不用动但涉及外部通信、文件读写、网络请求的部分要换成微信小游戏环境支持的方式。文件这块微信小游戏没有Unity常规意义上的可写文件系统。你要保存存档得通过微信的wx.setStorage或者wx.getStorage来操作。Unity侧封装一个持久化类底层存到微信 Storage 里我在项目里是封装了一个StorageManager接口还是用Unity的PlayerPrefs风格但实现全换成wx的接口这样业务代码基本不用改。网络请求如果只是请求普通HTTP接口Unity自带的UnityWebRequest在转换后也能用但老版本里域名白名单和证书校验有坑。微信小游戏要求所有请求域名都在后台配置为合法域名而且必须是HTTPS。本地开发时可以勾选开发者工具里的“不校验合法域名”但提审前必须配好。音频这块也是个坑区。微信小游戏支持的音频格式有限我之前项目里用了一堆MP3结果在部分安卓机上没声音查了半天发现是格式编码问题。建议统一转成OGG或者M4A并在代码里做好音频加载失败的容错。插件的接入URL我放这里注意看官方仓库说明 https://github.com/wechat-miniprogram/minigame-unity-webgl-transform3.4 打包与转换完整命令流程工程配置完成后打包这一步是整个流程的主干我拆细一点。先确认转换插件已经正确导入Unity工程。装好插件之后Unity菜单栏会出现“微信小游戏/小游戏”相关选项。第一次使用要先在插件面板里填上你的AppID和游戏名称保存后会生成一个wechatgame目录结构。倒入插件后切到WebGL平台打开Build Settings点“WebGL”然后直接点“Build And Run”之前要三思因为Unity原生的WebGL导出跟微信小游戏不是一回事。正确顺序是在Build Settings里确认场景列表里有你要打包的场景。Player Settings里按上面说的做基础配置。点“Build”选择输出目录Unity会生成一个标准的WebGL构建产物。构建完成后回到Unity菜单栏点“微信小游戏—转换小游戏”插件会读取刚才生成的WebGL产物自动做代码替换、资源切割、路径修正最终在输出目录旁生成一个webgl-transform文件夹。用微信开发者工具导入这个转换后的文件夹项目类型选“小游戏”AppID填你的小程序AppID就能看到游戏跑起来了。我第一回走这套流程时卡在了第4步。插件提示“Invalid Data”排查下来是因为输出目录有中文路径插件解析不了。以后所有操作路径尽量用纯英文。4. 核心能力接入登录、分享、排行榜这些“高端”功能怎么做4.1 微信登录与用户信息小游戏最重要的能力链路第一环是登录。在小游戏环境里获取用户身份是通过wx.login拿code然后后端用code换openid和session_key。Unity侧没办法直接调wx.login需要在转换插件暴露的JS接口层调用。插件里已经预留了一个JSSDK桥接类可以用WX.InitSDK初始化然后在C#里通过插件提供的API面板绑定方法。我的做法是在C#代码里定义好登录按钮的点击事件点击后调用一个封装好的方法里面执行微信小游戏插件的“UserLogin”接口插件底层会调wx.login并通过回调返回code。拿到code之后发到自己的服务器换取登录态。有一点要提醒微信小游戏环境下wx.getUserInfo和wx.getUserProfile这类接口有版本差异而且个人主体拿不到手机号也拿不到用户真实昵称头像的完整信息。新版微信里用户头像昵称都变成了“微信头像”和“微信昵称”的通用样式除非用户主动点击授权按钮否则开发者拿不到真实昵称和头像。在Unity里做UI展示时先放默认头像和“微信用户”等授权回调后再替换体验会顺很多。4.2 好友排行榜和开放数据域热词里有个“unity2022国际版开发微信小游戏 如何获取好友排行榜”这个问题问的人特别多。很多Unity开发者被“开放数据域”这个概念绕晕了。它的原理是小游戏环境是隔离的普通游戏逻辑所在的“主域”不能直接访问微信的社交关系链数据必须通过开放数据域去拿。开放数据域和主域的关系可以理解成两个独立运行、只能通过特定通道通信的进程。在Unity小游戏适配方案里排行榜的实现路径是在转换后的项目里找到plugin-open-data或类似名字的开放数据域目录。这里跑的不是Unity渲染而是微信小游戏原生的Canvas绘制代码。在开放数据域里用wx.getFriendCloudStorage拿到好友分数数据。主域的Unity画面里留出一个区域给开放数据域渲染排行榜或者通过postMessage把分数数据传回主域再由Unity侧自己画排行榜UI。我建议直接用后一种方式主域通过wx.postMessage把用户分数传给开放数据域开放数据域通过wx.getFriendCloudStorage拿到好友分数后再把整理好的数组传回主域Unity侧用UGUI把这些数据渲染成排行榜列表。这样绕开了两套渲染系统混排的问题UI风格也统一。C#侧需要加一个[jslib]调用的桥接方法把C#数组转成JSON字符串给JS这个封装不复杂但转来转去容易出隐藏bug建议统一用JsonUtility序列化。4.3 支付、广告与流量主个人主体能不能开通支付和广告这是另一个高频问题。个人主体可以开通流量主广告但要满足累计独立访客(UV)不低于1000的条件。换句话说你的小游戏得先有1000个真实用户访问才能申请开通流量主。广告类型上可以选Banner广告、激励视频广告、插屏广告接入方式都是通过wx.createRewardedVideoAd这类接口。个人主体不能开通微信支付或者说微信支付目前主要面向企业主体。如果产品需要付费解锁功能个人主体几乎没法做合规的虚拟支付。这是客观限制我的建议是个人主体项目尽量靠广告变现或者线下场景收取服务费别把虚拟支付做进核心设计里。4.4 抖音等跨端扩展热词里有一条“unity 抖音 侧边栏 接入流程”说明不少人在探索跨端发布。抖音小游戏和微信小游戏的适配思路非常像都是基于WebGL的转换方案。Unity社区里有一种做法是先在微信这套流程里调试通过再用抖音小游戏插件做一次转换逻辑代码复用率能到80%以上。不过抖音平台的类目审核、支付和广告体系跟微信差别不小跨端建议放在微信跑通并稳定之后再考虑。5. 提审上线的全流程与关键材料准备5.1 提审前要准备哪些东西小游戏提审基本材料就这几样应用名称、简介、图标。隐私保护指引。这个很容易被忽略个人主体也得填。重点是说明你收集了哪些用户信息、用途是什么。做登录功能就会涉及openid、手机型号这些填表时别漏项。截图和演示视频。截图至少4张视频一般是演示核心功能时长1分钟以内不要过度展示游戏化元素。类目资质。个人主体走工具/教育类目不需要额外上传营业执照只要在类目描述里写清楚产品价值就行。其中最容易卡的是隐私保护指引。我第一次提审被打回就是因为没提“使用微信登录功能时会收集用户的OpenID”。补充说明后第二天就过了。5.2 提审流程与版本管理提审操作在微信开发者工具里就能完成。点右上角“上传”填版本号和项目备注然后到微信公众平台后台的“版本管理”页面把刚上传的版本设为“体验版”先用手机扫体验版二维码做真机测试。真机测试通过后再点“提交审核”。这一步有个细节提交审核时要填“功能页面”和“测试账号”。如果产品有需要登录才能使用的功能最好提供一个游客模式或者测试账号不然审核员进不了主流程大概率驳回。我的项目因为依赖微信登录就加了个“游客浏览”模式审核一次过。版本号管理上Unity工程版本号、转换后项目版本号和微信后台版本号三者最好保持一致。这个建议来自我一次真实翻车Unity里改了版本号但忘了同步微信开发者工具里的版本号导致线上用户看到的版本和代码对不上排查问题浪费了大半天。6. 常见问题与排查技巧实录6.1 热词里的那些坑我基本全踩过把标题相关的热门搜索词挨个过一遍有不少问题在我看来有共性。“unity微信小游戏打包”——第一次打包最容易出的问题是构建产物太大。微信小游戏主包限制4MB整个包首包限制20MB。Unity项目哪怕是个空场景WebGL产物也经常超过2MB再加几个贴图就爆了。解决办法是严格压缩贴图、关闭不必要的Player Setting选项、资源全部走远程加载。远程资源可以放到自己的服务器或者用微信云开发把大资源文件上传到云存储运行时用UnityWebRequest非阻塞加载。“unity textmeshpro 会被ui挡到”——这个症状本质是渲染层级问题在微信小游戏里特别常见。UGUI的渲染顺序由Canvas的SortingOrder和UI元素的层级决定TextMeshPro在小游戏环境下偶尔会出现深度穿插是因为WebGL合批逻辑和原生环境有细微差异。我的排查方法很简单把TextMeshPro的Canvas单独提出来设置一个较大的SortingOrder问题基本消失。“unity vertical layout group没刷新”——这听起来像是手机原生开发的问题但Unity里一样有。VerticalLayoutGroup在动态增删子物体后会出现布局不刷新的情况。在小游戏环境里问题更容易触发因为微信的帧循环和Unity不完全同步。解决方法是在增删子物体后调用LayoutRebuilder.ForceRebuildLayoutImmediate强制重建布局。“unity unitask.forget”——这个关键词表明大家在用UniTask做异步。在小游戏环境里UniTask的线程调度和主线程切换偶尔会有时序问题。我的做法是凡是涉及微信SDK回调的全部用插件自带的主线程回调机制不直接用UniTask的continuation。“unity dllnotfoundexception: unable to load dll slua”——SLua这类Lua热更方案在WebGL上基本跑不通因为WebGL不支持动态加载native插件。如果Unity项目里用了SLua或者xlua做热更转到微信小游戏前要做好心理准备要么改用纯C#加少量静态配置的方案要么彻底移除Lua层。“unity混淆”——WebGL包的代码混淆度天然比原生包高因为最终下发的是二进制和压缩JS。但如果你有商业机密级别的算法逻辑需要保护建议把核心逻辑放到后端服务器算前端只做展示。6.2 问题速查表我整理了一张表格把个人主体Unity转微信小游戏最高频的问题汇总一下你直接对号入座。现象根本原因解决方案首包超过20MB限制贴图和音频资源过大压缩贴图资源全部改远程加载白屏控制台无报错Brotli压缩兼容性问题换Gzip压缩格式排行榜拿不到好友数据未接入开放数据域按上文开放数据域流程接入登录回调永远不触发AppID填错或初始化失败核对AppID检查WX.InitSDK初始化顺序音频在部分安卓机没声音音频编码格式不兼容转成OGG/M4A编码UI层级错乱Canvas SortingOrder冲突单独设置SortingOrder提交审核被打回类目和内容不匹配调整产品描述避免游戏化表述6.3 我个人的一点实操体会别看这一整套流程写下来好像很顺我第一次跑通的时候从Unity导出到真机跑起来前后折腾了将近两周。大部分时间不是花在写代码上而是花在处理WebGL和微信小游戏这个“夹缝环境”的兼容性问题上。后来我养成了一个习惯任何一行代码一问自己“这个在浏览器里能跑吗”再问一句“这个在微信的WebView里能跑吗”两层过滤之后能踩的坑少了一大半。最后再分享一个小技巧善用微信开发者工具里的“真机调试”和“性能面板”。性能面板能直接看到DrawCall、内存占用、CPU占用这些数据比我之前在Unity Profiler里瞎猜效率高多了。真机调试时记得开“自动预览”改完代码自动刷新开发体验能提升一个台阶。
返回列表