ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Unity开发微信小游戏实战:一人工作室上线闭环指南

Unity开发微信小游戏实战:一人工作室上线闭环指南 1. 项目概述为什么一个“一人工作室”要死磕微信小游戏“Vibe Gaming”这个名字听起来像支有十几号人的独立游戏团队但实际就是我一个人——白天写代码、晚上调美术资源、凌晨改bug、周末自己录宣传视频、上线后盯着后台数据看用户留存曲线。这个项目标题里的“一人工作室”不是营销话术是实打实的物理现实一台MacBook Pro、一块二手数位板、一个降噪耳机、微信开发者工具开三个窗口编辑器调试器真机预览、Unity编辑器占满另一半屏幕外加一个永远在跑构建的终端窗口。核心关键词就五个微信小游戏、Unity、开发实战、打包配置、上线闭环。它解决的不是“能不能做出来”的问题而是“如何在零运营预算、无美术外包、无测试团队的前提下让一款轻量级休闲游戏从0到1稳定上线、被真实用户玩到、还能拿到基础流水”的全流程生存问题。很多人看到“微信小游戏”第一反应是“不就是H5游戏用Canvas画个圆再加个点击事件就行”。但2024年的真实情况是微信小游戏生态已经完成三次迭代。2017年靠JS Canvas硬扛2019年转向WebGLThree.js2022年起Unity和Cocos成为绝对主流——因为用户对画面、音效、交互反馈的要求早就不满足于“能动就行”。而Unity作为跨平台引擎其优势恰恰在“一次开发、多端部署”但微信小游戏是个特例它不跑在标准浏览器里而是运行在微信自研的XWeb内核上这个内核阉割了部分WebGL扩展、限制了内存分配策略、强制使用微信自己的音频播放API、甚至对WebSocket连接做了超时重连封装。所以Unity打包出来的WebGL包不能直接扔进微信开发者工具——它会报错、卡顿、音效消失、真机黑屏。这就是为什么标题里强调“实战”这不是教你怎么拖拽UI组件而是告诉你当Unity导出的index.html在微信开发者工具里白屏时你该先查哪三行日志当iOS真机上粒子特效全变成方块时你该关掉Unity哪个渲染管线开关当微信审核驳回理由写着“未提供著作权登记证明”时你该去哪个网站、填哪七张表、等多少个工作日。这些细节文档里没有官方论坛里散落着碎片只有真正把游戏推过审、上过榜、收过款的人才记得清每一步踩过的坑有多深。2. 整体设计思路为什么选Unity而不是原生JS或Cocos2.1 技术栈选型背后的三重现实约束选Unity不是因为它“高级”而是因为它是当前一人工作室在微信小游戏赛道上综合成本最低、容错率最高、变现路径最清晰的选择。我们来拆解这句判断背后的硬逻辑第一重约束是人力不可再生性。一个人每天有效编码时间约4-6小时其余时间要处理美术、音效、文案、客服、数据分析。如果用原生JS开发意味着我要自己实现一套2D骨骼动画系统Spine Runtime太重Lottie又不支持交互、自己写物理碰撞检测Box2D移植到XWeb有兼容问题、自己封装微信登录/支付/分享接口每个接口回调时机不同Promise链容易断裂。而Unity的Timeline、Animator、Addressables系统已经把80%的重复劳动封装好了。我花3小时配好一个角色动画状态机比花3天手写JS动画循环事件监听性能优化更划算。第二重约束是美术资源复用率。我不会画画但能找到免费CC0协议的像素图、购买低价的Spine动画素材包、用Blender生成简单3D模型。Unity的Prefab系统让我能把一个“金币拾取”逻辑打包成预制件拖进任意场景就能用而原生JS项目里每个新关卡都要重写一遍金币生成、碰撞、音效、粒子效果——这对单人开发者是毁灭性的时间消耗。Cocos Creator虽然也支持Prefab但其TypeScript生态的第三方插件数量比如广告SDK适配、热更新框架只有Unity的1/3遇到问题时Stack Overflow上的答案少一半GitHub Issues里没人跟进。第三重约束是变现与合规的确定性。微信小游戏目前主推两种变现激励视频广告用户看30秒广告得双倍金币和虚拟道具购买买皮肤、解锁关卡。Unity的Unity Ads和Unity IAPSDK官方已针对微信小游戏XWeb环境做过深度适配接入只需5行代码且自动处理iOS/Android/微信三端差异。而原生JS项目要对接优量汇、穿山甲等广告平台得自己写WebView桥接、处理安卓返回键拦截、适配iOS的WKWebView内存泄漏——这些工作量够我再开发两个小游戏了。提示别被“Unity包体大”吓退。2024年微信小游戏首屏加载允许15MB以内资源含代码图片音频Unity通过AssetBundle分包微信云托管CDN可将首包压到800KB以下。我上线的《弹珠冲浪》首包仅623KB加载耗时1.2秒iPhone 12实测。2.2 架构分层把“一人能控”刻进系统设计整个项目采用四层架构每一层都为单人维护而设计表现层View纯UI逻辑用UGUI实现。所有按钮、进度条、弹窗都做成预制件通过UIManager单例统一管理打开/关闭。禁止任何业务逻辑写在Button.onClick里——这点看似琐碎但能避免后期改需求时到处找事件绑定。逻辑层Controller核心游戏规则。例如《弹珠冲浪》的“冲浪板跟随手指滑动弹珠物理反弹”逻辑全部封装在GameplayController脚本里。输入只接收Touch.position输出只触发OnBallBounce事件绝不操作UI或存档。数据层Model本地存档与全局配置。用微信的wx.setStorageSync存玩家等级、金币数、成就进度用JSON文件存关卡配置如第5关障碍物密度、弹珠初始速度修改数值不用改代码。服务层Service对接微信能力。单独建WXService类封装wx.login()、wx.createBannerAd()、wx.requestPayment()等调用。关键设计是所有微信API调用都包装成带重试机制的Promise比如网络请求失败自动重试2次避免因微信后台临时抖动导致功能不可用。这种分层不是为了“高大上”而是为了让我生病请假三天回来后能快速定位问题如果广告不显示只看WXService如果关卡卡住只查GameplayController如果UI文字错位直奔UIManager。一人工作室的架构必须服务于“快速恢复工作流”。2.3 工具链闭环从代码到上线的最小可行流水线工具链设计原则就一条所有重复操作必须一键完成。我写了三个核心脚本build_wechat.shShell脚本自动执行Unity命令行构建-executeMethod BuildScript.BuildWeChat、压缩资源、上传CDN、生成微信开发者工具项目结构、打开开发者工具。全程无需手动点菜单。deploy_version.pyPython脚本读取version.json含版本号、更新日志、热更资源MD5自动生成微信小游戏版本发布所需的game.json和subContext/assets/manifest.json并调用微信开放平台API提交审核。monitor_log.jsNode.js服务监听微信云开发数据库的game_logs集合当出现高频报错如1分钟内OnAdError超10次自动发企业微信消息提醒我检查广告位ID。这套流水线让我把一次版本迭代从“手动操作17步、耗时42分钟”压缩到“敲一行命令、喝杯咖啡、11分钟后收到上线通知”。对于没时间、没人力的一人工作室自动化不是锦上添花是活下去的氧气。3. 核心细节解析Unity打包微信小游戏的七个致命陷阱3.1 模板配置为什么官方模板反而最容易翻车Unity导出WebGL时默认使用内置的Default模板。但微信小游戏要求所有资源必须通过wx.loadSubNVue或wx.downloadFile加载而Default模板的index.html直接用script srcBuild/xxx.js引入这会导致XWeb内核拒绝执行——因为微信禁止直接加载外部JS。解决方案是替换为微信专用模板但这里有个巨大误区很多人直接下载微信官方提供的Unity WebGL模板结果发现构建后白屏。真相是微信官方模板2023版只适配Unity 2021.3 LTS而我用的是2022.3.22f1因需支持URP 14。版本错配会导致UnityLoader.js里的createUnityInstance函数签名不匹配控制台报TypeError: Cannot read properties of undefined (reading then)。正确做法是在Unity Hub里安装2021.3.35f1 LTS长期支持版微信适配最稳下载微信官方模板 https://github.com/wechat-miniprogram/unity-webgl-template 将模板中TemplateData/UnityLoader.js的第127行var unityInstance createUnityInstance(canvas, config, (progress) { /*...*/ });替换为var unityInstance createUnityInstance(canvas, config).then((instance) { /*...*/ });因为2021.3版createUnityInstance返回Promise而2022版返回实例对象。注意别试图用2022版Unity硬套旧模板。我试过用Babel转译结果iOS真机上音频API失效——XWeb内核对JS语法有严格校验async/await会被静默忽略。3.2 内存管理XWeb的“温柔杀手”微信小游戏对单页内存占用设了硬上限iOS端≤120MBAndroid端≤180MB。超过即被XWeb内核强制回收进程表现为你正玩着游戏突然回到微信首页。Unity默认的WebGL构建会把所有AssetBundle打进Build/xxx.data加载时全塞进内存。我的《弹珠冲浪》初始场景含3个角色动画、5种音效、12张UI图未优化前内存峰值达210MB。破局关键在分帧加载Frame-by-Frame Loading第一帧只加载MainScene.unity3d含UI和基础逻辑体积压到180KB第二帧用Resources.LoadAsync异步加载角色动画AB包同时显示“加载中”遮罩第三帧加载音效AB包完成后移除遮罩后续所有关卡资源按需加载/卸载用Addressables.ReleaseInstance及时释放。Unity的Addressables系统在此发挥核心作用。我为每个资源设置Label如audio_bgm,scene_level3在Addressables.RuntimeProperties里配置RemoteLoadPath指向微信云存储URL。这样资源不打包进首包用户玩到第3关才下载第3关资源内存压力直线下降。实测数据优化后iOS内存峰值稳定在89MBAndroid在112MB完全在安全线内。3.3 音频方案为什么AudioSource.Play()在真机上静音这是微信小游戏最隐蔽的坑。Unity的AudioSource.Play()在微信开发者工具里一切正常但一到iOS真机所有音效全无声。原因在于XWeb内核要求所有音频必须由用户手势触发防止网页自动播放骚扰而Unity的WebGL音频后端Web Audio API在初始化时未绑定到touchstart事件。解决方案分两步在Unity C#脚本里创建一个空GameObject挂AudioInitHandler脚本public class AudioInitHandler : MonoBehaviour { void Start() { // 强制触发一次用户交互唤醒音频上下文 if (Application.isMobilePlatform) { StartCoroutine(InitAudioContext()); } } IEnumerator InitAudioContext() { // 等待第一帧渲染完成 yield return new WaitForEndOfFrame(); // 播放一段0.1秒的静音音频需提前准备silence.mp3 AudioSource.PlayClipAtPoint(Resources.LoadAudioClip(silence), Vector3.zero); } }在微信模板的index.html里给canvas添加touchstart监听script document.getElementById(unity-canvas).addEventListener(touchstart, function() { // 触发Unity的音频初始化 if (typeof UnityInstance ! undefined UnityInstance UnityInstance.SendMessage) { UnityInstance.SendMessage(AudioInitHandler, InitAudio); } }, { once: true }); // 只触发一次 /script这个方案实测覆盖iOS 15-17、Android 10-14所有机型。记住静音音频文件必须是MP3格式XWeb对AAC支持不稳定且采样率设为44100Hz。3.4 热更新机制如何绕过微信的“代码包大小限制”微信小游戏代码包即game.json所在目录上限为4MB但Unity构建的Build/目录轻松破20MB。热更新是唯一出路但微信不提供原生热更API必须自己造轮子。我的方案是双通道资源热更代码热更用Unity的Scripting Define Symbols区分“热更模式”。构建时定义WECHAT_HOTUPDATE此时GameManager启动逻辑改为#if WECHAT_HOTUPDATE // 从微信云存储下载最新hotupdate.js string url https://xxx.cos.ap-shanghai.myqcloud.com/hotupdate_v2.1.0.js; WWW www new WWW(url); yield return www; // 执行JS代码需提前注入Jint引擎 JintEngine.Execute(www.text); #else // 正常启动流程 #endif资源热更所有非代码资源图片、音频、AB包全部走微信云开发wx.cloud.downloadFile。关键技巧是在Assets/Resources/Config/下放update_manifest.json记录每个资源的md5和cloudPath。每次启动时对比本地MD5与云端MD5只下载变更文件。这套方案让我把2.1.0版本的更新包从3.8MB压缩到217KB仅含JS逻辑3个变更资源用户更新耗时从45秒降到3.2秒。3.5 著作权登记不是“要不要”而是“怎么高效办”2024年微信小游戏上架强制要求提供计算机软件著作权登记证书否则审核直接驳回。很多人以为这是“形式主义”其实它是微信风控体系的关键一环——证书号会关联到你的微信支付商户号用于识别是否为同一主体。办理流程其实很清晰但细节决定成败申请主体必须是企业或个体工商户。个人开发者无法申请。我注册了个体户深圳南山XX科技工作室成本800元含刻章银行开户3个工作日下证。代码要求提交的源码需满足“核心代码占比≥70%”。Unity项目里Assets/Scripts/下的C#文件算核心代码Library/、Temp/、Build/目录必须删除。我用Python脚本自动清理import os, shutil for root, dirs, files in os.walk(Assets): if Plugins in dirs: shutil.rmtree(os.path.join(root, Plugins)) # 删除第三方插件 for f in files: if f.endswith((.meta, .dll, .so)): os.remove(os.path.join(root, f))文档撰写《软件设计说明书》里“系统架构图”不能画UML要手绘微信小游戏架构含Unity层、XWeb层、微信API层“模块说明”必须对应GameplayController.cs、WXService.cs等真实文件名描述其功能字数不少于300字。整个流程从准备材料到拿到证书我用了11天加急服务。费用明细代理费1200元 官方登记费250元 个体户注册800元 2250元。这笔钱不是成本是门票——没有它游戏连审核入口都进不去。3.6 真机调试为什么“开发者工具”永远不是真机微信开发者工具模拟的是XWeb内核的“理想态”而真机运行的是“现实态”。常见差异包括iOS Safari WebKit vs XWebXWeb禁用localStorage但开发者工具里能用。解决方案所有本地存储必须走wx.setStorageSync。Android WebView vs XWebXWeb对WebGLRenderingContext的getExtension调用返回null导致Unity的URP管线报错。解决方案在PlayerSettings Publishing Settings WebGL里将Color Space从Linear改为Gamma牺牲一点画质换稳定性。触摸事件延迟XWeb的touchstart有300ms延迟为兼容双击缩放导致游戏响应迟钝。解决方案在index.html的head里加meta nameviewport contentwidthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0 style * { touch-action: manipulation; } /style真机调试的黄金法则是每周至少用3台真机iPhone 12/14、小米13跑一次完整流程。我建了个表格记录每台设备的异常设备型号问题现象解决方案复现概率iPhone 14 Pro粒子特效闪烁关闭URP的HDR选项100%小米13广告加载超时将adUnitId从adunit-xxx改为adunit_xxx微信要求下划线80%iPad Air 5UI元素错位在Canvas Scaler里将Scale Factor从1改为0.95100%没有这张表你永远不知道下一个崩溃来自哪里。3.7 性能优化60FPS不是目标是底线微信小游戏的性能红线是持续运行30分钟CPU占用≤45%帧率波动≤±5FPS。Unity默认设置在XWeb上极易超标。我的优化清单剔除冗余组件删除所有MeshRenderer上未使用的Material禁用Light组件小游戏不用实时光照纹理压缩所有PNG转ETC1AndroidASTCiOS在Texture Import Settings里勾选Override for Android/iOS代码裁剪在PlayerSettings Other Settings里将Api Compatibility Level设为.NET Standard 2.1禁用Mono后端启用IL2CPP减少GC压力合批优化UI元素用Canvas Group代替多个Image所有静态UI打成Atlas用Unity的Sprite Atlas物理简化Rigidbody2D的Collision Detection从Continuous改为DiscreteFixed Timestep从0.02改为0.03。最终《弹珠冲浪》在iPhone 12上实测平均帧率59.2FPSCPU占用38%内存占用89MB。达标。4. 实操全流程从新建项目到微信审核通过的23个关键步骤4.1 环境准备避开Unity版本陷阱第一步永远是最关键的。我见过太多人卡在第一步卸载所有Unity Hub和Unity编辑器从Unity官网下载Unity 2021.3.35f1 LTS注意不是2021.3.36也不是2022.x安装时勾选WebGL Build Support和Android Build SupportiOS支持非必需但建议装上创建新项目Template选3D Core不要URP初期复杂度太高在Project Settings Player Other Settings里将Color Space设为GammaApi Compatibility Level设为.NET Standard 2.1导入微信小游戏SDK从 https://developers.weixin.qq.com/minigame/dev/guide/open-capability/wx-api.html 下载weapp-unity-sdk.unitypackage双击导入。注意如果导入SDK后报CS0246: The type or namespace name WX could not be found说明SDK未正确加载。解决方案在Assets/Plugins/WeChat/Editor/下找到WeChatPostprocessor.cs将第1行#if UNITY_EDITOR改为#if UNITY_EDITOR || UNITY_WEBGL。4.2 项目搭建用Addressables实现资源分治资源管理是单人开发的生命线。我建立的标准目录结构Assets/ ├── AddressableAssetsData/ # Addressables配置 ├── Resources/ # 仅放极小资源如配置JSON ├── Scenes/ # 场景文件 ├── Scripts/ # C#脚本 │ ├── Core/ # 核心逻辑GameplayController等 │ ├── Service/ # 微信服务WXService.cs │ └── UI/ # UI逻辑UIManager.cs ├── Sprites/ # 图片资源 └── Audio/ # 音频资源Addressables配置流程Window Asset Management Addressables Groups右键Default Local GroupCreate New Group命名为Scene_Group将Scenes/下所有.unity文件拖入该组Build Path设为scenes/{group}/{address}同理创建Audio_Group、Sprite_Group在Addressables Groups窗口右上角点Build New Build Default Build Script。构建后所有资源生成catalog.json和catalog.sb存于Assets/AddressableAssetsData/。后续加载代码// 加载场景 Addressables.LoadSceneAsync(Level_3); // 加载音频 Addressables.LoadAssetAsyncAudioClip(bgm_main).Completed obj { audioSource.clip obj.Result; audioSource.Play(); };这套方案让我在开发第5版时能只更新Sprite_Group而不影响其他资源热更包体积减少62%。4.3 微信能力接入五步完成登录-支付-广告闭环微信能力不是“接入”而是“编织”进游戏逻辑。以《弹珠冲浪》为例第一步登录与用户标识public class WXService { public static void Login() { wx.login(new LoginOption { success: (res) { // res.code 发送到自己服务器换取openid StartCoroutine(PostCodeToServer(res.code)); }, fail: (err) Debug.Log(Login failed: err.errMsg) }); } }第二步广告加载激励视频private void LoadRewardAd() { rewardAd wx.createRewardedVideoAd({ adUnitId: adunit-xxxx }); rewardAd.onLoad(() Debug.Log(Ad loaded)); rewardAd.onError((err) Debug.Log(Ad error: err.errMsg)); }第三步广告展示与奖励发放public void ShowRewardAd() { if (rewardAd) { rewardAd.show().catch((err) { // 展示失败可能是用户跳过仍发奖励提升体验 GiveReward(); }); rewardAd.onClose((res) { if (res res.isEnded) { GiveReward(); // 用户看完发双倍奖励 } }); } }第四步支付接口购买皮肤public void BuySkin(string skinId) { wx.requestPayment(new PaymentOption { timeStamp GetTimestamp(), nonceStr GenerateNonce(), package $prepay_idwx{GetPrepayId(skinId)}, signType RSA, paySign GetPaySign(), success: (res) { // 支付成功解锁皮肤 UnlockSkin(skinId); } }); }第五步分享拉新public void ShareGame() { wx.shareAppMessage(new ShareMessageOption { title 我在玩超上头的弹珠游戏, imageUrl https://xxx.com/share.jpg, query refshare_ playerId, success: (res) Debug.Log(Share success) }); }关键经验所有微信API调用必须包裹try/catch并在fail回调里记录日志。我用Debug.LogException把错误推送到Sentry一周内捕获到17个adUnitId invalid错误——全是测试时手误填错ID。4.4 构建与发布从Unity到微信开放平台的11个动作构建不是点“Build”就完事。完整流程在Unity里File Build SettingsPlatform选WebGLTarget Device选PC and Console别选Mobile点Player Settings在Publishing Settings里Decompression Fallback勾选兼容旧机型Compression Format选Brotli体积最小WebGL Memory Size设为256单位MBXWeb最大支持256MB点Build输出目录设为Build/WebGL运行build_wechat.sh自动完成复制微信模板文件到Build/WebGL替换index.html中的script标签为微信加载逻辑压缩Build/WebGL/Build/下所有.js、.data文件为.brBrotli生成game.json含minPlatformVersion、deviceOrientation等将Build/WebGL整个目录复制到微信开发者工具项目根目录在开发者工具里点详情 项目设置勾选ES6转ES5、增强编译、上传代码时进行代码保护点上传填写版本号如2.1.0、项目名称、描述登录 微信开放平台 进入管理中心 小游戏 版本管理找到刚上传的版本点提交审核上传著作权证书扫描件PDF、游戏截图6张含启动页、主界面、广告页、支付页、设置页、结束页填写审核说明“本游戏为单机休闲类无社交功能广告仅出现在关卡结束页面支付仅用于购买皮肤无虚拟货币系统。”整个流程耗时约22分钟。我用计时器记录过最快一次从点击Build到审核提交成功用时19分38秒。4.5 审核应对读懂微信审核员的潜台词微信审核驳回理由往往很简短但每个词都是线索“游戏内容与描述不符”截图里没体现描述中的“每日签到”功能。解决方案在截图第4张里用红色箭头标出签到按钮并在审核说明里写明“签到功能位于主界面右上角日历图标”。“存在诱导分享行为”分享后没给奖励但文案写了“分享得100金币”。解决方案要么删文案要么真发奖励我选择后者用wx.getShareInfo验证分享真实性。“未提供著作权登记证明”证书号填错一位。解决方案微信要求证书号一字不差包括括号和空格我曾因把软著登字第1234567号写成(软著登字第1234567号)被驳回。“广告展示不符合规范”激励视频广告没加“跳过”按钮。解决方案在wx.createRewardedVideoAd后手动在Canvas上画一个半透明“跳过”按钮点击时调用rewardAd.hide()。最有效的审核技巧是提前自查清单。我打印了一份A4纸每次提交前逐项打钩[ ] 著作权证书号与上传文件一致[ ] 所有截图包含微信顶部状态栏开发者工具里开启“显示状态栏”[ ] 广告位ID在代码和审核后台完全一致[ ] 支付页面有明确价格和商品描述不能只写“购买皮肤”[ ] 游戏内无任何外链、二维码、联系方式用这份清单我的审核通过率从第一次的37%提升到最近5次的100%。5. 常见问题与排查技巧实录一人工作室的故障排除手册5.1 白屏问题从日志定位到根因的四步法白屏是Unity微信小游戏最常见问题但原因千差万别。我的排查流程第一步看开发者工具Console如果报Uncaught ReferenceError: UnityLoader is not defined→ 模板index.html里script标签路径错误检查Build/UnityLoader.js是否被正确复制如果报Failed to load resource: the server responded with a status of 404 ()→Build/目录下缺少.js或.data文件检查Unity构建日志末尾是否有ERROR如果报TypeError: Cannot read property then of undefined→ Unity版本与模板不匹配按3.1节修复。第二步看Network面板所有.js、.data文件状态码应为200若出现404检查index.html里src路径是否含多余/如/Build/xxx.js应为Build/xxx.js若catalog.json加载失败检查Addressables的RemoteLoadPath是否指向有效URL且CORS已开启。第三步真机调试iOS用Safari远程调试设置 Safari 高级 Web检查器开启在Console里看是否报SecurityError: The operation is insecure→ 音频未初始化按3.3节修复Android用Chromechrome://inspect重点看console和networkXWeb内核日志会显示[XWeb] WebGL context lost→ 显存超限按3.2节优化内存。第四步最小化复现新建空Unity项目只导入微信SDK放一个TextMeshPro显示“Hello”构建后测试。若仍白屏则是环境问题若正常则原项目某脚本冲突逐个禁用Scripts/下文件排查。这套方法让我平均3分钟内定位90%的白屏问题。5.2 广告失效从ID校验到生命周期管理的全链路检查广告不展示是收入杀手。我的检查清单检查项方法常见错误AdUnitId有效性在微信开放平台流量主 广告位管理里确认状态为“已启用”且AppID与小游戏一致测试时用adunit-test-xxx上线忘了改广告加载时机在rewardAd.onLoad回调里打日志确认是否触发onLoad未注册就调show()导致show()失败用户手势上下文确保show()调用在touchstart或click事件回调内而非Start()或Update()在Update()里每帧调show()XWeb拒绝执行广告位数量限制同一页面最多同时存在3个广告实例创建了5个rewardAd第4个起加载失败iOS隐私权限在PlayerSettings iOS Other Settings里Privacy - Tracking Usage Description填“用于提供个性化广告”缺少此描述iOS 14广告不展示独家技巧在广告加载失败时自动降级为“观看3秒视频得10金币”的静态视频用VideoPlayer组件播放本地MP4保证用户体验不中断。这段逻辑我封装在AdManager.cs里已复用到3个项目。5.3 热更新失败网络、存储、版本号的三角验证热更失败往往表现为“更新了但没变”。排查三要素网络层用wx.cloud.downloadFile时检查fileID是否正确。微信云存储的fileID形如cloud://xxx.abc-1234
返回列表