Unity游戏发布微信小游戏:从构建到提审

一、工作内容

1. 微信小游戏接口构造

  Unity C#代码不能直接调用微信JS原生接口。微信小游戏存在主域、开放数据域双域隔离,好友数据只能在开放域读取,主域只能发送消息通知子域完成分数存储、榜单拉取。

实现:

  添加WeChatHelper.cs静态工具类,统一封装微信小游戏平台能力:游戏内分享、玩家最高分上报、排行榜弹窗显示/关闭。

  基于微信WASM SDK,利用PostMessage完成主域与开放数据域的消息通信;使用预编译指令#if UNITY_WEBGL && !UNITY_EDITOR区分编辑器环境与微信打包环境,真机环境下调用微信原生API;增加try-catch捕获异常,防止SDK未就绪时游戏崩溃。

2. 修复GameScene黑屏问题

  URP可编程渲染管线(SRP)在微信WebGL环境兼容性差,打包过程着色器容易被引擎剥离丢失,导致画面黑屏;切换回Unity内置渲染管线,并且锁定图形API为WebGL2.0,保证2D精灵正常渲染。

实现:

  排查WebGL打包后模拟器黑屏、场景精灵无法渲染的问题,调整Unity图形API与渲染管线配置,修改精灵材质,修复场景渲染异常。

3. 实现微信排行榜(开放数据域)

  微信出于用户隐私保护,限制游戏直接读取好友信息。好友排行榜数据只能在独立的开放数据域访问;开放域渲染完成后输出纹理给主域,主域把纹理贴到UI上展示。

实现:

  搭建微信小游戏双域架构,接入官方开放数据域模板。

  主域通过消息向子域下发指令:上报最高分、显示/关闭排行榜;子域负责调用微信云存储接口存取分数、绘制排行榜UI;主域通过RawImage接收子域渲染纹理,展示排行榜。

4. 解决编译器wasm加载失败问题

  微信小游戏个人开发者账号权限有限,不支持Layout插件;

  game.json内保留该插件配置会导致小程序启动时读取插件失败,wasm模块加载报错。

实现:

  定位打包后启动报错read plugin file empty的根源,修改game.json配置文件,删除Layout插件配置,清理缓存后重新打包,解决wasm文件读取失败问题。

5. 完成上传提审

  微信小游戏上线需要满足平台合规校验,隐私授权、类目资质、代码安全全部审核通过,小游戏才能对外发布。

实现:

  整理微信小游戏后台审核材料,填写服务类目、隐私协议、版本更新说明,打包正式版本,完成提审前自检,提交微信平台审核。

二、遇到并解决的问题

1. 渲染管线配置问题

  • 现象:
    模拟器黑屏,游戏界面加载不出来。
  • 原因:
    项目初始使用URP 3D Forward渲染器,在WebGL平台兼容性极差。将渲染器替换为URP2D、颜色空间改为Gamma、图形API固定为WebGL2.0,解决了UI渲染问题,UGUI可以正常显示。
    但URP整套SRP管线在微信WebGL环境依然存在严重适配问题,URP2D的精灵着色器变体过多,打包时会被Unity着色器裁剪机制误删,导致Sprite方块、场景背景依旧黑屏。
    最终将SRP设为None、切换为Unity内置渲染管线后,使用轻量化的内置Sprites/Default着色器,不再出现Shader裁剪问题,精灵渲染恢复正常。
  • 解决:
    将URP的3D Forward渲染器替换为URP 2D Renderer(URP2D),同时修改颜色空间为Gamma、图形API固定为WebGL2.0,UGUI界面正常渲染;
    后续将SRP设为None,彻底移除URP管线切换到Unity内置渲染管线,Sprite背景、游戏方块正常显示。

2. wasm加载失败

  • 现象:
    模拟器编译报错read plugin file empty,wasm模块加载失败,游戏无法启动。
  • 原因:
    微信小游戏个人主体账号没有Layout插件的使用权限。而game.json配置文件中声明了Layout插件,小程序启动阶段会尝试读取该插件文件,但文件不存在,直接抛出插件为空的错误,阻断wasm游戏代码加载。
  • 解决:
    删除game.json文件中plugins节点内Layout相关插件配置;
    清理缓存,重新打包。

三、学习总结

1. 微信小游戏SDK调用

  通过微信WASM SDK,在Unity C#代码中调用微信原生能力,实现游戏分享、开放数据域控制等功能。

csharp 复制代码
// 微信分享
WX.ShareAppMessage(new ShareAppMessageOption{title = "WoodPuzzle",imageUrl = ""}); 

// 向开放数据域发送消息,拉取好友排行榜
WX.GetOpenDataContext().PostMessage("{\"type\":\"showFriendsRank\"}");
// 输出开放数据域渲染的画面
WX.ShowOpenData(rankTex, 0,0,Screen.width,Screen.height);

// 关闭开放数据域渲染
WX.HideOpenData();

2. 微信小游戏双域架构

  微信小游戏分为主域与开放数据域两个相互隔离的运行环境:

  主域运行Unity游戏业务逻辑;开放数据域拥有读取微信好友关系、好友云存储分数的权限。两者用PostMessage通信。

  主域Unity不能直接读写微信好友云存储,只能发消息给开放数据域,由子域调用微信云存储接口:

csharp 复制代码
// 主域:发送消息通知开放域上报玩家最高分
WX.GetOpenDataContext().PostMessage("{\"type\":\"setUserRecord\",\"score\":" + bestScore + "}");

// 主域:发送消息通知开放域拉取并展示好友排行榜
WX.GetOpenDataContext().PostMessage("{\"type\":\"showFriendsRank\"}");

3. 好友排行榜

  • 分数存储:
    主域通过PostMessage下发指令;
    开放域收到消息后,调用微信接口setUserCloudStorage,把玩家分数上传到微信云存储。
  • 榜单拉取:
    主域下发展示指令;
    开放域调用getFriendCloudStorage读取好友分数,并在子域Canvas绘制排行榜UI;
    主域调用WX.ShowOpenData(),把开放域画面渲染到RawImage上展示给玩家。
  • 画面输出:
    开放域绘制完成后,通过SDK输出纹理到Unity的Texture2D对象;
    主域调用WX.ShowOpenData(),把开放域画面渲染到RawImage上展示。
csharp 复制代码
// 将开放数据域渲染画面输出到主域纹理
WX.ShowOpenData(_rankTex, 0, 0, Screen.width, Screen.height);
// 关闭开放域渲染输出
WX.HideOpenData();

四、下一步计划

  1. 等审核通过发布上线
  2. 完成ICP备案
相关推荐
WarPigs10 小时前
Unity对象不应该使用null传播的问题
unity
每日出拳老爷子1 天前
【VR】【Unity】抓走转放系列21|一天搭完门和抽屉工具槽:小场景按这个次序拼装
unity·vr·驱动·排错·snap zone
八荒启·交互动画2 天前
Web特效025—用 Canvas 2D 做Web特效的定义与边界:这支画笔能做到哪一步
前端·webgl·网页特效·八荒启-交互动画·八荒启
淡海水2 天前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
小贺儿开发2 天前
Unity 文物新生 会讲故事的文物展墙
人工智能·科技·unity·ai·视频·互动·演示
淡海水2 天前
02-03-原理篇-大对象堆
unity·c#·游戏引擎·.net·gc
Bruce_Liuxiaowei3 天前
网页版 DeepSeek “harness desktop“ WebGL 上下文创建失败排查实录
开发语言·javascript·webgl
WarPigs3 天前
Unity在Create菜单添加创建自定义脚本模板选项
unity
淡海水3 天前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
babywang03 天前
Unity笔记--塔防游戏中的ECS架构:从原理到实战的全面解析
unity·ecs架构