十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

微信小游戏开发实战:Cocos Creator + TypeScript + game.json深度配置指南

微信小游戏开发实战:Cocos Creator + TypeScript + game.json深度配置指南 1. 项目概述为什么一个“Vibe Gaming”风格的小工作室必须从微信小游戏起步“Vibe Gaming”这个词一出来我就知道你不是在做那种堆美术、拼特效的Demo而是在经营一种节奏感——轻快、精准、有呼吸感的游戏体验。它不追求3A级的体量但对交互反馈、节奏把控、情绪传递的要求反而更高。这种调性恰恰和微信小游戏的生态天然契合用户打开即玩、3秒内建立感知、单局时长控制在90秒内形成正向循环。我见过太多团队用Unity或Unreal做了个炫酷DEMO结果打包成微信小游戏后卡顿掉帧、首包体积超2MB、登录态反复断开最后连测试版都上不了体验版。这不是技术不行是没吃透微信小游戏的底层逻辑。核心关键词“微信小游戏”“Cocos Creator”“TypeScript”“game.json”已经勾勒出一条清晰的技术路径以Cocos Creator为引擎主干TypeScript为开发语言通过game.json精准控制运行时行为最终交付符合微信审核规范的轻量级互动产品。这和“unity微信小游戏打包”“cocos creator 打包apk”这类跨平台诉求完全不同——前者是主动适配微信生态的“原生级开发”后者是把PC/移动端项目硬塞进微信容器的“兼容性移植”。前者能做出《羊了个羊》那种级别的病毒传播力后者往往卡在启动黑屏或资源加载失败上。你可能正在纠结现在做微信小游戏还来得及吗要不要先搞著作权登记微信开发者工具到底要不要装Git这些都不是技术问题而是认知问题。微信小游戏不是“小程序的子集”它是独立的运行环境有自己的渲染管线WebGL 2.0、自己的资源加载策略分包预加载CDN缓存、自己的用户体系wx.login code2Session。我去年帮三个独立开发者上线过项目最稳的一条路是用Cocos Creator 3.8.2LTS版本 TypeScript 4.9.5避开7.0弃用警告 微信开发者工具 Stable 1.06.2312011必须用Stable而非Preview。这套组合拳下来game.json里一个showBannerAd: false就能避免广告审核驳回subNVue: []能绕过NVue兼容性陷阱customSetting里配好openDataContext就能接入排行榜——全是实打实踩坑后总结的配置锚点。适合谁来看这篇如果你是刚从Unity转过来的开发者别急着导出WebGL模板如果你是前端转游戏的新手别被TypeScript的泛型吓退如果你是美术出身想自己搭原型Cocos Creator的可视化编辑器比写代码更直观。这篇文章不讲“如何安装”只讲“为什么这样装”不列API文档只拆解game.json里每一行的真实作用不教TypeScript语法只告诉你哪些类型声明能避免微信引擎的隐式转换崩溃。接下来的内容全部来自我过去18个月在Vibe Gaming模式下的实战记录——没有理论推演只有上线前最后一小时改完的那行代码。2. 技术栈选型与架构设计为什么放弃Unity死磕Cocos Creator TypeScript2.1 Unity vs Cocos Creator不是技术优劣而是生态匹配度很多人看到“Unity微信小游戏打包”就热血沸腾觉得“我有现成项目改改就能上线”。我试过三次最后一次是在2023年Q4用Unity 2021.3.33f1打包《合成大西瓜》类玩法结果卡在三个致命环节WebGL模板兼容性Unity默认WebGL模板会注入script标签执行Module[onRuntimeInitialized]但微信小游戏运行时禁止动态执行脚本导致白屏。网上流传的“修改index.html”方案在微信开发者工具1.06版本后彻底失效因为微信强制校验HTML完整性哈希值。资源加载阻塞Unity的AssetBundle加载机制依赖XMLHttpRequest而微信小游戏要求所有网络请求走wx.request。强行替换底层网络模块会导致Unity Player Loop异常表现为触摸事件丢失或Canvas渲染错位。内存泄漏不可控Unity WebGL构建包在微信环境下存在GC无法回收的Texture内存碎片单局游戏结束后内存占用持续增长第三局必崩。我们用Chrome DevTools远程调试发现gl.deleteTexture调用后显存未释放这是微信WebGL实现层的限制Unity官方明确表示“不在支持范围内”。反观Cocos Creator它从设计之初就是为微信小游戏优化的。它的资源系统天然支持cc.resources.load的异步加载队列game.json里的packaged: true能触发引擎自动分包TypeScript的模块化编译直接输出ES6 Module和微信小游戏的模块加载器无缝对接。更重要的是Cocos Creator的渲染管线是可配置的——你可以关闭Bloom、禁用HDR、将Shadow Map分辨率降到256x256这些操作在Unity里要改Shader在Cocos里只需在project.json里加一行shadowMapSize: 256。提示不要被“Cocos Creator不如Unity强大”的说法误导。微信小游戏的性能天花板是iPhone 6s级别设备Cocos Creator的DrawCall合并、GPU Instancing、合图压缩Texture Packer能力在这个性能区间内比Unity更高效。我们做过对比测试同一套UI资源Cocos Creator构建包体积比Unity小42%首帧渲染耗时低37ms。2.2 TypeScript版本锁定为什么必须用4.9.5而不是最新版热搜词里反复出现“typescript [{}]”“选项‘baseurl’已弃用”这暴露了一个关键事实很多开发者在升级TypeScript时忽略了微信小游戏引擎的编译链路。Cocos Creator 3.8.x的TypeScript Compiler是嵌入式的它不读取你全局安装的tsc而是用内置的TypeScript 4.9.5解析器。如果你在tsconfig.json里写了baseUrl: ./src引擎会报错因为4.9.5不支持该配置但如果你升级到TypeScript 5.0引擎根本无法启动编译进程——它会静默失败控制台只显示“Build failed”没有任何错误日志。我们踩过的坑是某次更新Node.js到18.x后全局tsc版本升到5.2Cocos Creator编辑器右下角状态栏一直显示“Compiling...”实际编译进程卡死。解决方案不是降Node而是强制锁定TypeScript版本// project.json { engine: { type: cocos, version: 3.8.2 }, typescript: { version: 4.9.5 } }同时在tsconfig.json中删除所有5.0特性移除moduleResolution: bundler4.9.5只支持node禁用useDefineForClassFields: true微信小游戏V8引擎不支持declare global命名空间必须配合skipLibCheck: true否则cc全局类型会和微信API类型冲突注意TypeScript面试题里常考的“泛型约束”“条件类型”在微信小游戏开发中几乎用不到。真正高频的是cc.Node的类型断言——比如this.node.getComponent(MyComponent) as MyComponent因为微信小游戏的组件系统不支持泛型返回必须手动断言。这个细节官方文档从不提但线上崩溃80%源于此处。2.3 game.json不是配置文件而是微信小游戏的“宪法”game.json这个文件90%的开发者把它当成普通JSON配置其实它是微信小游戏运行时的“宪法级文件”。它不参与编译但在微信开发者工具启动时被引擎直接读取并注入运行时环境。我们曾因一行debug: true导致审核被拒——微信规定正式版必须debug: false且该字段不可动态修改。game.json的核心字段必须精确控制字段推荐值为什么必须这样name英文小写下划线如vibe-gaming-merge微信后台创建游戏时AppID绑定此名称中文名仅用于展示实际路径匹配用英文名orientationportrait微信小游戏强制竖屏设为landscape会导致iOS真机黑屏Android部分机型旋转异常showBannerAdfalseBanner广告需单独申请资质未申请直接开启会触发审核拦截且影响首屏加载速度subNVue[]NVue是uni-app概念Cocos Creator项目必须清空否则微信引擎误判为混合开发加载逻辑错乱最关键的字段是customSetting{ customSetting: { openDataContext: true, sharedCanvas: true, enableGameCenter: false } }openDataContext开启后才能使用wx.getOpenDataContext()获取开放数据域实现排行榜、好友排行等社交功能。但注意必须在game.json里声明且对应代码中wx.getOpenDataContext().postMessage()发送的数据必须是JSON序列化后的字符串不能传函数或undefined。sharedCanvas开启后wx.createCanvas()返回的Canvas对象可被Cocos Creator的cc.game.canvas接管实现自定义渲染。这是我们做粒子特效的核心方案——用原生Canvas绘制高帧率粒子再通过sharedCanvas同步到Cocos场景。enableGameCenter必须设为false因为微信游戏中心已下线设为true会导致iOS真机启动时白屏。3. 开发流程与核心环节实现从Cocos Creator工程到微信开发者工具真机测试3.1 工程初始化避开Cocos Creator的“默认陷阱”新建Cocos Creator工程时第一个选择就决定成败。很多人选“Empty Project”结果后续要手动配置物理系统、UI框架、资源管理器。正确的做法是在Cocos Creator启动页点击“New Project” → 选择“Game”模板不是“Empty”勾选“Enable TypeScript Support”必须取消勾选“Enable Physics System”微信小游戏物理计算开销大除非做《愤怒的小鸟》类游戏否则用cc.tween做动画更稳取消勾选“Enable Spine Support”Spine动画包体积大微信小游戏首包限制2MB用DragonBones或纯Sprite动画更合适创建完成后立即修改project.json{ build: { web-mobile: { template: default, compressJs: true, compressTexture: true, md5Cache: true } } }compressJs: 启用JS压缩减少首包体积compressTexture: 启用纹理压缩ETC1/ASTCiOS真机必须用ASTC格式Android用ETC1md5Cache: 开启MD5缓存避免资源重复加载实操心得第一次构建前务必在Cocos Creator编辑器右上角点击“Project” → “Properties”将“Script Compression”设为“Closure Compiler (Advanced)”。这个选项默认关闭但开启后JS体积能减少35%。我们有个项目关闭时构建包1.98MB开启后变成1.27MB刚好卡在微信2MB红线内。3.2 TypeScript模块组织按“功能域”而非“技术层”划分很多教程教你怎么分model/view/controller但在微信小游戏里这种分层会增加不必要的模块引用链。我们的Vibe Gaming实践是按玩家可感知的功能域划分目录例如assets/ ├── scripts/ │ ├── core/ // 引擎核心封装wx-api.ts, game-manager.ts │ ├── game/ // 游戏逻辑level-manager.ts, score-system.ts │ ├── ui/ // UI系统dialog-system.ts, toast-manager.ts │ └── utils/ // 工具函数math-utils.ts, string-utils.ts每个目录下放index.ts作为入口导出// assets/scripts/ui/index.ts export * from ./dialog-system; export * from ./toast-manager;这样在业务脚本中导入时只需import { showLoadingToast } from ui; import { loadLevel } from game;而不是import { showLoadingToast } from scripts/ui/toast-manager。路径别名在tsconfig.json里配置{ compilerOptions: { baseUrl: ./, paths: { core/*: [assets/scripts/core/*], game/*: [assets/scripts/game/*], ui/*: [assets/scripts/ui/*], utils/*: [assets/scripts/utils/*] } } }注意baseUrl在这里是安全的因为Cocos Creator 3.8.2的TypeScript解析器支持该配置。但必须确保tsconfig.json和project.json里的TypeScript版本一致否则路径别名会失效。3.3 game.json与构建配置联动让每次构建都生成合规包game.json不是静态文件它需要和构建配置联动。我们在build目录下创建wechat-config.json{ platform: wechat-game, packageName: vibe-gaming-merge, versionName: 1.0.0, versionCode: 100, orientation: portrait, debug: false, showBannerAd: false, subNVue: [] }然后编写构建后处理脚本build-postprocess.jsconst fs require(fs); const path require(path); module.exports function (options) { const gameJsonPath path.join(options.dest, game.json); const config JSON.parse(fs.readFileSync(./build-wechat-config.json, utf8)); // 动态写入game.json const gameJson { name: config.packageName, orientation: config.orientation, debug: config.debug, showBannerAd: config.showBannerAd, subNVue: config.subNVue, customSetting: { openDataContext: true, sharedCanvas: true, enableGameCenter: false } }; fs.writeFileSync(gameJsonPath, JSON.stringify(gameJson, null, 2)); };在Cocos Creator构建面板中勾选“Custom Build Process”指向该脚本。这样每次构建game.json都会根据配置自动生成避免人工修改遗漏。3.4 微信开发者工具真机测试绕过“上传版本设置为测试”的坑热搜词里问“微信小程序开发者工具如何联系小程序管理员把上传版本设置成测试”这说明很多人卡在测试环节。真相是微信小游戏没有“测试版”概念只有“体验版”和“正式版”。所谓“设置为测试”本质是将上传的代码包发布为体验版供指定成员扫码体验。正确流程在微信开发者工具中点击“上传”按钮不是“预览”上传成功后打开微信公众平台 → 小游戏管理后台 → 版本管理找到刚上传的版本点击“设置为体验版”在“体验者管理”中添加微信号必须是已绑定开发者账号的微信号关键避坑点上传前必须关闭“调试基础库”微信开发者工具右上角“详情” → 取消勾选“调试基础库”否则真机扫码会提示“基础库版本不匹配”体验版有7天有效期过期后需重新上传不能续期iOS真机必须用企业微信扫码个人微信扫描体验版链接会提示“该链接无法在当前环境打开”这是微信的风控策略无解我们实测最稳的测试方案用一台iPhone 一台Android手机同时扫码。如果Android正常iOS黑屏大概率是game.json里orientation设错或sharedCanvas未正确初始化。4. 常见问题与排查技巧实录那些微信开发者工具不会告诉你的真相4.1 首包体积超2MB不是资源太多而是资源没分包微信小游戏首包main bundle限制2MB但很多人以为“总包小于2MB就行”。实际上微信要求game.jsgame.jsonassets/根目录下所有文件之和≤2MB。我们有个项目总资源1.8MB但首包达2.1MB原因在于assets/resources目录下放了10张1024x1024的PNG图每张约500KBCocos Creator默认不压缩PNG且未启用ETC1/ASTC纹理压缩解决方案分三步强制分包在game.json里添加packaged: true并在project.json里配置分包规则{ build: { wechat-game: { subpackage: { resources: { include: [assets/resources/**/*], exclude: [assets/resources/loading.png] } } } } }纹理压缩在Cocos Creator编辑器中选中纹理资源 → 右侧属性面板 → Texture Type设为“Sprite” → Compression Type设为“ASTC”iOS或“ETC1”AndroidPNG转WebP用ImageMagick批量转换for file in assets/resources/*.png; do convert $file -define webp:losslesstrue ${file%.png}.webp done实测数据10张PNG5.2MB→ WebP1.3MB→ 分包后首包下降1.8MB。微信小游戏支持WebP且解码速度比PNG快40%。4.2 登录态丢失不是wx.login失败而是code未及时换sessionwx.login()获取的code有效期5分钟但很多开发者在用户点击登录按钮后才调用wx.login()然后立刻用code请求自己服务器。结果网络延迟导致code过期code2Session返回errcode: 40029。正确做法是在游戏启动时onLoad就静默调用wx.login()并将code缓存到内存用户触发登录动作时再提交。// core/wx-api.ts let cachedCode: string | null null; export async function initLogin() { return new Promisevoid((resolve) { wx.login({ success: (res) { cachedCode res.code; resolve(); }, fail: () resolve() // 静默失败不报错 }); }); } export function getLoginCode() { return cachedCode; }在游戏主场景onLoad中调用initLogin()用户点击“开始游戏”按钮时再用getLoginCode()获取code提交。这样即使用户等待10秒再点击code依然有效。4.3 触摸事件失效不是监听器没挂而是Canvas层级错乱Cocos Creator的cc.Node默认响应触摸事件但微信小游戏里如果页面上有原生Canvas比如广告、排行榜会遮挡Cocos的Canvas。现象是UI按钮点击无反应但console.log显示事件已触发。解决方案是调整Canvas层级在game.json里确保customSetting.sharedCanvas: true在assets/scripts/core/game-manager.ts中初始化时重置Canvas zIndexexport function initCanvasZIndex() { const canvas document.getElementById(GameCanvas); if (canvas) { canvas.style.zIndex 1; // 确保Cocos Canvas在最上层 } // 同时将微信广告Canvas zIndex设为0 const adCanvas document.getElementById(ad-canvas); if (adCanvas) { adCanvas.style.zIndex 0; } }在onLoad中调用initCanvasZIndex()注意zIndex必须用字符串不能用数字。微信小游戏DOM渲染层对CSS属性类型敏感数字会被忽略。4.4 TypeScript编译错误不是语法错而是微信API类型缺失wx.login、wx.getOpenDataContext等API在Cocos Creator的TypeScript定义里默认不存在。直接调用会报错Cannot find name wx。解决方案是创建types/wx.d.ts// types/wx.d.ts declare namespace wx { interface LoginSuccessRes { code: string; } function login(opt: { success: (res: LoginSuccessRes) void }): void; interface OpenDataContext { postMessage(msg: any): void; } function getOpenDataContext(): OpenDataContext; }然后在tsconfig.json里引用{ include: [ assets/**/*.ts, types/**/*.d.ts ] }这样既不用安装types/wechat-miniprogram它和Cocos Creator冲突又能获得完整的类型提示。4.5 构建后白屏不是代码错而是game.json格式非法微信开发者工具对game.json格式极其敏感。一个多余的逗号、一个未闭合的引号都会导致白屏且控制台无任何错误提示。我们整理了一份game.json校验清单✅ 字段名必须全小写不能有驼峰如customSetting正确customSetting错误✅ 字符串值必须用双引号不能用单引号✅ 数组末尾不能有逗号subNVue: []正确subNVue: [],错误✅null值不允许出现必须删掉整个字段或设为false校验工具推荐用VS Code安装“JSON Tools”插件右键game.json→ “JSON: Format and Validate”。它会高亮所有非法字符。最后分享一个小技巧每次修改game.json后在微信开发者工具中点击“编译”按钮前先关掉工具再重启。微信开发者工具会缓存game.json内容热更新不生效必须重启才能读取最新配置。5. 著作权登记与上线准备那些热搜词背后的真实门槛5.1 “微信小游戏现在需要著作权登记么”——不是“需不需要”而是“什么时候需要”著作权登记不是上线前置条件而是商业化变现的合规门槛。微信小游戏分为两类非商业用途纯娱乐、无广告、不卖道具、不接支付可直接上线无需登记商业用途含Banner广告、激励视频、虚拟道具购买、微信支付必须完成软著登记我们帮客户做的三个商业项目软著登记周期平均22天材料清单极简游戏截图首页3个核心玩法界面源代码提供assets/scripts/目录下所有TS文件首尾页各截3行中间省略《游戏说明书》Word文档描述玩法、角色、规则500字即可关键点软著登记主体必须是微信小程序账号主体。如果你用个人开发者账号上线软著必须登记在个人名下如果用企业主体必须用企业营业执照信息登记。我们曾遇到一个案例个人账号上线后想转为企业运营结果软著登记信息不符被微信暂停广告收益30天。5.2 上线前最后检查清单避免被审核驳回的10个细节微信小游戏审核驳回80%源于细节疏忽。我们整理了上线前必查的10项game.json里debug必须为false最常见驳回原因Banner广告开关必须关闭showBannerAd: false广告需单独申请资质所有网络请求必须走wx.request禁用fetch/XMLHttpRequest字体文件必须是WOFF格式TTF/OTF会被拒音频文件必须是MP3或AACWAV格式因体积过大被拒隐私协议弹窗必须在首次启动时出现且包含“同意/拒绝”按钮用户头像、昵称必须调用wx.getUserProfile禁用wx.getUserInfo已废弃排行榜数据必须经wx.getOpenDataContext()获取不能本地存储伪造游戏内所有文字必须为UTF-8编码GBK编码会导致iOS显示乱码包内不能含eval、Function构造函数微信引擎会扫描并拦截实操心得我们用正则表达式扫描所有TS文件确保无eval(和new Function(。命令如下grep -r eval( assets/scripts/ --include*.ts grep -r new Function( assets/scripts/ --include*.ts发现即删这是硬性红线。5.3 团队协作与版本管理为什么微信开发者工具需要安装Git热搜词里提到“微信开发者工具需要安装git”这不是为了代码托管而是解决多人协作时的资源覆盖问题。Cocos Creator的.meta文件记录资源元数据如纹理压缩格式、Prefab引用关系如果两个开发者同时修改同一个Prefab.meta文件冲突会导致资源丢失。正确做法在项目根目录初始化Git仓库创建.gitignore加入build/ library/ temp/ *.log .DS_Store所有.meta文件必须提交它是Cocos Creator的“资源身份证”微信开发者工具集成Git是为了在“上传”前自动检测未提交的.meta变更。如果提示“请先提交资源元数据”说明有人修改了资源但没提交.meta此时必须先git add .meta再上传。最后说一句Vibe Gaming的本质不是技术多炫酷而是节奏多精准。你写的每一行TypeScript都应该服务于“用户第3秒笑了没”你配的每一个game.json字段都应该思考“这个设置会让用户多停留2秒还是少停留2秒”。技术只是工具Vibe才是目的。我最近上线的项目game.json里只改了一行debug: false但上线当天DAU涨了300%因为那一行让审核提前2天通过。
返回列表