scenario-unity-mobile
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseUnity mobile (mobile specialist)
Unity 移动端(移动端专家)
Expert mobile work means a game that holds its frame rate after twenty minutes on a three-year-old phone, starts fast, installs from the store, and never double-charges or double-grants. The stance: budget the sustained frame, prove every setting on the data the device gets (imported format, built bundle, exported Xcode project), and treat stores, SDKs and money code as contracts with ugly event orders. Target: Unity 6000.3.21f1, URP 17.3, Input System 1.20, macOS with Xcode 26.6. If a sibling skill named here is missing from your available skills, ask the user to install it (); unattended, proceed from tool schemas and flag the gap.
npx skills add scenario-labs/skills --skill <name>REQUIRED BACKGROUND: scenario-unity-expert (channels, review loop, 6.3 traps). Toolkit: (imports , , ), editor jobs in , player code in .
scripts/ut_mobile.pyut_envut_runut_statscripts/AgentKit/Mobile/scripts/Runtime/专业的移动端工作意味着:游戏在一台三年前的手机上运行 20 分钟后仍能保持帧率,启动快捷,能够从商店完成安装,而且绝不会重复扣款或重复发放权益。其原则是:为持续帧率设定预算,基于设备实际获得的数据(导入格式、构建后的 bundle、导出的 Xcode 项目)验证每一项设置,并将商店、SDK 和支付代码视为契约,同时妥善处理其混乱的事件顺序。目标环境:Unity 6000.3.21f1、URP 17.3、Input System 1.20、macOS 与 Xcode 26.6。如果这里提到的某个同级 skill 不在你可用的 skills 中,请要求用户安装();在无人值守的情况下,依据工具 schema 继续执行,并标记该缺口。
npx skills add scenario-labs/skills --skill <name>必需背景: scenario-unity-expert(、review loop、6.3 陷阱)。工具包:(导入 、、),Editor 作业位于 ,Player 代码位于 。
channelsscripts/ut_mobile.pyut_envut_runut_statscripts/AgentKit/Mobile/scripts/Runtime/Stance (the expert delta)
原则(专家侧重点)
- Budget the sustained frame, not the peak. About 65% of 1000/fps (10.8 ms at 60, 21.7 ms at 30), judged on p95 and max, on the lowest phone, short bursts, 10 to 15 minutes of cooldown; assume vsync, so a missed refresh halves the rate (Unity mobile e-book). Under heat, lower render scale first only when the GPU is the bottleneck: resolution barely helps a CPU-bound frame (6.3 Manual). Prove the policy with synthetic thermal events, not a hot phone (d5O4Uw6gPBI [00:04:21]). Editor timings are relative; draw and SetPass counts are the stable Editor evidence (observed).
- Check the effective format, then lock the rule. A texture the GPU cannot sample is decompressed to RGBA32 on the CPU (6.3 Manual); an HDR map without an ASTC HDR override imported as ETC2_RGBA8 (observed). ASTC 4x4 UI and faces, 6x6 default, 8x8 big environment maps [added]; crunch does nothing on ASTC. Audio: WAV sources, mono SFX at 22,050 Hz at most, ADPCM under 200 KB, Streaming only above about 400 KB (e-book). An keeps new assets compliant (Unity Enterprise Support, j4YAY36xjwE [00:19:07]).
AssetPostprocessor - Mobile URP is not PC URP with a lower slider. Depth Priming Disabled (unsupported on Android, iOS and TBDR), Native RenderPass on, Depth and Opaque textures off unless sampled, HDR off or 32-bit, soft shadows off, Store Actions Auto or Discard (6.3 Manual). One URP asset per Quality tier; a batch editor launched for Android still reported Quality "PC" (observed; same trap in 2J0kDtUGlrY [frame 00:10:28]).
- Release builds are reproducible from the environment. Unity never stores keystore passwords: set them in the build process from env vars; Google refuses the debug keystore (6.3 Manual; LlamAcademy, GTaXWgKz0e8 [00:06:24]). Development Build off, symbols in the bundle from the first upload: Play never symbolicates crashes received before the symbols (6.3 Manual). Check the built bundle, not the settings.
- The Android main thread and the splash are shared budgets. Most game ANRs happen while backgrounding: nothing heavy in , SDK init staggered after milestones, symbols shipped; read the signature, the previous exit reason on next launch, and exclude low-revenue devices that dominate ANRs (Unity Android team, pezwIhA0e04 [00:27:24], [00:25:12], [00:13:13], [00:41:40], [00:29:02]). The Resources index and first-scene
OnApplicationPauserun under the splash (j4YAY36xjwE [00:33:59]); a loader scene reports its real interactive frame withAwake(6.3 Manual).CallReportFullyDrawn - Money code is idempotent. Validate, grant, then ; dedupe by transaction id in flight and persisted; pending orders from
ConfirmPurchasego through the same path; aOnPurchasesFetchedon confirm is retried with the kept order, never regranted; buy only fetchedFailedOrderobjects; never revoke on an empty Google fetch; show the store's localized price; handProductto attribution SDKs (IAP 5 docs; Unity, szS2KMxZsl4 [00:07:27], [00:09:28], [00:11:38]). Grant rewarded ads injwsRepresentationwhatever the callback order.OnAdRewarded - Touch is events and virtual devices; the HUD lives in one safe-area panel. EnhancedTouch, never in Update; on-screen controls emit a virtual Gamepad; thumb controls at Constant Physical Size (Input System team, ptvjumIHxYg [00:20:29]).
Touchscreen.currentis a radius (observed). Render outside the safe area on, HUD in amovementRangepanel (Chema Damak, PLQ4ywB13eg [00:10:53]); UI Toolkit top =SafeAreaFitter(proven by test). The Device Simulator is one finger, no performance, noScreen.height - safeArea.yMax, no native plug-ins (6.3 docs).UNITY_IOS - SDKs and stores are contracts. Consent answered before the first ad request, ad SDK init after the first milestone, nothing monetized in the first 10 to 15 minutes, offers when the player is stuck (Creauctopus, ILv7GzDgteQ [00:01:58], [00:09:00]); SKAdNetworkItems and every SDK's privacy manifest on iOS, AD_ID on API 33+ (LevelPlay docs; 6.3 Manual), the ATT text when you track [added]; Data safety answered from the SDK vendors' guides; one internal-track upload before IAP products can exist (GTaXWgKz0e8 [00:09:06]; UXl_C3ZnRLc [00:02:28]). 6000.3.21f1 defaults to IAP 4.15.1 and LevelPlay 8.10.1: pin 5.4.3 and 9.5.1 first.
- 为持续帧率做预算,而不是只关注峰值。 预算约为 1000/fps 的 65%(60 fps 时为 10.8 ms,30 fps 时为 21.7 ms),依据最低配置手机上的 p95 和 max 判定,并覆盖短时突发负载以及 10 到 15 分钟的冷却期;假定启用了 vsync,因此错过一次刷新会让帧率减半(Unity 移动端电子书)。发生热衰减时,只有在 GPU 是瓶颈时才优先降低 render scale:对 CPU 受限的帧而言,降低分辨率几乎无助于性能(6.3 Manual)。应使用合成热事件来验证策略,而不是依赖已经发热的手机(d5O4Uw6gPBI [00:04:21])。Editor 中的计时数据是相对值;draw 和 SetPass 计数是稳定的 Editor 证据(实测)。
- 先检查实际生效的格式,再锁定规则。 如果 GPU 无法采样某种纹理,它会在 CPU 上被解压为 RGBA32(6.3 Manual);未设置 ASTC HDR override 的 HDR 贴图会以 ETC2_RGBA8 导入(实测)。UI 和面部使用 ASTC 4x4,默认使用 6x6,大型环境贴图使用 8x8 [added];crunch 对 ASTC 不起作用。音频:源文件使用 WAV;单声道 SFX 的采样率最高为 22,050 Hz;小于 200 KB 时使用 ADPCM;仅当文件大于约 400 KB 时才使用 Streaming(电子书)。使用 确保新资源符合规范(Unity Enterprise Support,j4YAY36xjwE [00:19:07])。
AssetPostprocessor - 移动端 URP 不是把 PC URP 的参数调低。 将 Depth Priming 设为 Disabled(Android、iOS 和 TBDR 不支持),开启 Native RenderPass,除非会被采样,否则关闭 Depth 和 Opaque 纹理,关闭 HDR 或使用 32-bit,关闭软阴影,将 Store Actions 设为 Auto 或 Discard(6.3 Manual)。每个 Quality tier 使用一个 URP asset;为 Android 启动批处理 Editor 时仍报告 Quality“PC”(实测;2J0kDtUGlrY 中存在同样的陷阱 [frame 00:10:28])。
- 发布构建必须能从环境复现。 Unity 不会存储 keystore 密码:应在构建流程中通过环境变量传入;Google 会拒绝 debug keystore(6.3 Manual;LlamAcademy,GTaXWgKz0e8 [00:06:24])。关闭 Development Build,从首次上传起就把符号文件包含在 bundle 中:Play 无法对在符号文件上传之前收到的崩溃进行符号化(6.3 Manual)。应检查构建后的 bundle,而不是仅检查设置。
- Android 主线程和启动画面共享同一份预算。 大多数游戏 ANR 都发生在应用转入后台时:中不得执行重操作,SDK 初始化应分散到各个里程碑之后,并随包发布符号文件;读取签名、在下次启动时读取上一次退出原因,并排除那些营收贡献较低却主导 ANR 的设备(Unity Android team,pezwIhA0e04 [00:27:24]、[00:25:12]、[00:13:13]、[00:41:40]、[00:29:02])。Resources 索引和首个场景的
OnApplicationPause会在启动画面显示期间运行(j4YAY36xjwE [00:33:59]);加载器场景通过Awake报告真正可交互的帧(6.3 Manual)。CallReportFullyDrawn - 支付代码必须具备幂等性。 先验证、再发放,然后调用 ;同时对处理中及已持久化的订单按 transaction id 去重;
ConfirmPurchase返回的 pending order 必须走同一流程;确认时出现OnPurchasesFetched,应使用保留的订单重试,绝不能再次发放;只能购买已获取到的FailedOrder对象;Google fetch 为空时绝不能撤销购买;显示商店的本地化价格;将Product交给归因 SDK(IAP 5 文档;Unity,szS2KMxZsl4 [00:07:27]、[00:09:28]、[00:11:38])。无论回调顺序如何,都应在jwsRepresentation中发放激励广告奖励。OnAdRewarded - 触控应基于事件和虚拟设备实现;HUD 应集中在一个安全区面板中。 使用 EnhancedTouch,绝不要在 Update 中使用 ;屏幕控件应发出虚拟 Gamepad 输入;拇指操作控件采用 Constant Physical Size(Input System 团队,ptvjumIHxYg [00:20:29])。
Touchscreen.current是半径(实测)。启用“在安全区外渲染”,将 HUD 放在movementRange面板中(Chema Damak,PLQ4ywB13eg [00:10:53]);UI Toolkit 的 top =SafeAreaFitter(测试已证明)。Device Simulator 仅支持单指,不具备性能测试能力,不提供Screen.height - safeArea.yMax,也不支持原生插件(6.3 文档)。UNITY_IOS - SDK 和商店都是契约。 在首次广告请求之前完成同意处理,在首个里程碑之后再初始化广告 SDK,开局 10 到 15 分钟内不进行任何变现,并在玩家卡住时提供相应选项(Creauctopus,ILv7GzDgteQ [00:01:58]、[00:09:00]);在 iOS 上提供 SKAdNetworkItems 以及每个 SDK 的隐私清单,在 API 33+ 上提供 AD_ID(LevelPlay 文档;6.3 Manual);启用跟踪时展示 ATT 文本 [added];依据 SDK 供应商的指南回答 Data safety 问题;IAP 商品存在之前,先向 internal track 上传一次(GTaXWgKz0e8 [00:09:06];UXl_C3ZnRLc [00:02:28])。6000.3.21f1 默认使用 IAP 4.15.1 和 LevelPlay 8.10.1:首先将其固定为 5.4.3 和 9.5.1。
Establish first
首先确定
Stores (Play needs an AAB); min-spec device list (GPU family decides ASTC vs ETC2); target fps per tier; download budget; orientation; ad network, IAP products, consent regimes (GDPR, CCPA, child-directed) and whether a backend validates receipts; signing material (keystore path and env var names, Apple team id: the human keeps them); whether a phone is connected (none here: device steps become a hand-over). Defaults: Mobile_High 60 fps and Mobile_Low 30 fps (Low ships, the director promotes), ASTC 6x6, min API 25, target API 36, iOS 15, IL2CPP ARM64, Vulkan then OpenGLES3, Minimal stripping to start.
商店(Play 需要 AAB);最低规格设备清单(GPU 系列决定使用 ASTC 还是 ETC2);每个 tier 的目标 fps;下载预算;屏幕方向;广告网络、IAP 商品、同意制度(GDPR、CCPA、儿童定向广告)以及是否由后端验证收据;签名资料(keystore 路径和环境变量名、Apple team id:由人工负责人保管);当前是否有手机连接(当前无:设备步骤将转为人工交接)。默认值:Mobile_High 为 60 fps,Mobile_Low 为 30 fps(Low 随包发布,由 director 提升),ASTC 6x6,最低 API 25,目标 API 36,iOS 15,IL2CPP ARM64,优先使用 Vulkan,然后是 OpenGLES3,起始阶段采用 Minimal stripping。
Workflow
工作流
- Baseline. ,
MobileTiers.AuditRendering,MobileBuild.AuditPlayerSettings,MobileTextures.AuditTextures,MobileAudio.AuditAudio,MobileStartup.AuditStartup,ut_mobile.code_scan(P), all withut_mobile.package_check(P). GATE: findings listed, Editor Quality level recorded.build_target="Android" - Tiers and thermals. ;
MobileTiers.ApplyTierswith PlayMode syntheticMobileTierDirectorevents. GATE:Feed0 errors; per-tier captures opened; the thermal test lowers lodBias and (GPU-bound only) render scale, restores both.AuditRendering - Assets. ,
FixTextures,FixAudio, thenAuditMeshesandImportedFormatsper target;ImportedAudioforimport_rules.json. GATE: 0 errors and warns, all ASTC, imported sizes down, new assets arrive compliant; captures before and after any Max Size drop.MobileImportRules - Input and UI. ,
SafeAreaFitter,BuildTouchHud. GATE:FloatingTouchStickandSafeAreaTestspass;TouchInputTestsfitted HUD clear, naive HUD blocked.CaptureSafeArea - Frame budget. per tier,
AgentProfile.PlayModeTimings;budget_verdict(csv, fps)goes into the development build. GATE: sustained verdict pass; device soak listed as Assumed.DeviceSoakLogger - Monetization. Pin packages; logic in ,
PurchaseLedger,RewardGate,AdPacing; adaptersAdsInitGate(validate, price, jws) andIap5Store(privacy flags before init). GATE:LevelPlayAdspass, adapters compile against the pinned packages,MonetizationTestsandcode_scanclean.package_check - Android release. ,
make_keystorewithMobileBuild.BuildAndroid. GATE: Succeeded;env=keystore_env(ks)0 errors (not debuggable, 16 KB pages, symbols, AD_ID if ads);aab_findingsunder budget, else Build Report by size then Play Asset Delivery; passwords not persisted.bundletool_sizes - iOS release. Privacy manifest in ,
Assets/Plugins,BuildIos+xcode_facts. GATE: Succeeded, reasons carried, target GUIDs reported;xcode_findingscommands (archive, App Store export, thinning report) shown to the human and run only with approval.ios_archive_plan - Device and store hand-over. Soak CSV judged by , native GPU profilers, Android vitals with ANR triage and
soak_verdict, sandbox purchase and restore, LevelPlay test suite then removal, Play Console and App Store Connect steps (procedures M13).ExitInfo
- 基线。 、
MobileTiers.AuditRendering、MobileBuild.AuditPlayerSettings、MobileTextures.AuditTextures、MobileAudio.AuditAudio、MobileStartup.AuditStartup、ut_mobile.code_scan(P),全部使用ut_mobile.package_check(P)。门禁:列出发现结果,并记录 Editor Quality 级别。build_target="Android" - Tier 与热衰减。 ;使用 PlayMode 合成
MobileTiers.ApplyTiers事件驱动Feed。门禁:MobileTierDirector为 0 个错误;打开每个 tier 的捕获结果;热衰减测试降低 lodBias,并且仅在 GPU 受限时降低 render scale,随后恢复两者。AuditRendering - 资源。 、
FixTextures、FixAudio,然后针对每个目标执行AuditMeshes和ImportedFormats;为ImportedAudio准备MobileImportRules。门禁:0 个错误和警告,全部采用 ASTC,导入后体积下降,新资源符合规范;每次降低 Max Size 前后都要保留捕获结果。import_rules.json - 输入与 UI。 、
SafeAreaFitter、BuildTouchHud。门禁:FloatingTouchStick和SafeAreaTests通过;TouchInputTests显示适配后的 HUD 无遮挡,而朴素 HUD 存在遮挡。CaptureSafeArea - 帧率预算。 对每个 tier 执行 、
AgentProfile.PlayModeTimings;将budget_verdict(csv, fps)加入 development build。门禁:持续性能判定通过;设备浸泡测试列为 Assumed。DeviceSoakLogger - 变现。 固定包版本;将逻辑放入 、
PurchaseLedger、RewardGate、AdPacing;适配器包括AdsInitGate(验证、价格、jws)和Iap5Store(初始化前处理隐私标志)。门禁:LevelPlayAds通过,适配器能够针对固定版本的包进行编译,MonetizationTests和code_scan无错误。package_check - Android 发布。 执行 ,并使用
make_keystore运行env=keystore_env(ks)。门禁:Succeeded;MobileBuild.BuildAndroid为 0 个错误(不可调试、16 KB pages、符号文件,以及使用广告时的 AD_ID);aab_findings在预算内,否则使用 Build Report 按体积排序,再使用 Play Asset Delivery;密码未被持久化。bundletool_sizes - iOS 发布。 将隐私清单放入 ,执行
Assets/Plugins、BuildIos和xcode_facts。门禁:Succeeded,保留 reasons,并报告 target GUID;向负责人展示xcode_findings命令(archive、App Store export、thinning report),仅在获得批准后执行。ios_archive_plan - 设备与商店交接。 使用 判定浸泡测试 CSV,使用原生 GPU profiler,执行 Android vitals 分析和 ANR 分诊与
soak_verdict,进行沙盒购买与恢复,运行 LevelPlay 测试套件后将其移除,并执行 Play Console 和 App Store Connect 步骤(procedures M13)。ExitInfo
Numbers
数值
| Value | Relative to | Source |
|---|---|---|
| 16.67 / 10.83 ms, 33.33 / 21.67 ms | raw / sustained (65%) budget at 60 and 30 fps | e-book |
| 10 to 15 min; 20 to 30 min | cooldown between device captures; soak length | e-book; [added] |
| up to 1 ms CPU | each enabled camera on low-end mobile | e-book |
| 8 to 0.89 bpp | ASTC 4x4 to 12x12 | 6.3 Manual |
| < 200 KB / > 350 to 400 KB; 22,050 Hz | audio load type buckets; mobile SFX sample rate ceiling | e-book |
| 200 MB / 100 MB | AAB base module / APK on Play; also the iOS cellular download limit (200) | 6.3 Manual |
| 16 KB (p_align 0x4000) | every native library's LOAD segments, Android 15+ pages | version deltas |
| API 25 / 36 | 6.3 minimum / Play target since 2026-08-31 (6.5 raises the minimum to 26) | version deltas |
| iOS 15, A8; Xcode 26 + iOS 26 SDK | 6.3 minimum; App Store since 2026-04-28 | version deltas |
| 5 s (10 s on some Samsung); 128 bytes | ANR timeout; exit state summary | pezwIhA0e04 [00:02:01], [00:42:13] |
| 3 days | Google refunds an unacknowledged purchase | IAP 5 docs |
| 10 to 15 min; every 3 min | monetization-free start; interstitial interval after a milestone | ILv7GzDgteQ (heuristics) |
| 54998 to 55511 | outbound ports for iOS remote profiling | 6.3 Manual |
| 0.125 to 0.925 | default Gamepad stick deadzone applied to on-screen stick values | observed |
| 数值 | 相对于 | 来源 |
|---|---|---|
| 16.67 / 10.83 ms,33.33 / 21.67 ms | 60 和 30 fps 下的原始 / 持续(65%)预算 | 电子书 |
| 10 到 15 分钟;20 到 30 分钟 | 设备捕获之间的冷却时间;浸泡测试时长 | 电子书;[added] |
| 最多 1 ms CPU | 低端手机上每个启用的 camera | 电子书 |
| 8 到 0.89 bpp | ASTC 4x4 到 12x12 | 6.3 Manual |
| < 200 KB / > 350 到 400 KB;22,050 Hz | 音频加载类型分桶;移动端 SFX 采样率上限 | 电子书 |
| 200 MB / 100 MB | AAB 基础模块 / Play 上的 APK;同时也是 iOS 蜂窝网络下载上限(200) | 6.3 Manual |
| 16 KB(p_align 0x4000) | Android 15+ 页面上每个原生库的 LOAD segments | 版本差异 |
| API 25 / 36 | 6.3 最低要求 / 自 2026-08-31 起的 Play 目标版本(6.5 将最低版本提升至 26) | 版本差异 |
| iOS 15、A8;Xcode 26 + iOS 26 SDK | 6.3 最低要求;自 2026-04-28 起的 App Store 要求 | 版本差异 |
| 5 秒(部分 Samsung 设备为 10 秒);128 字节 | ANR 超时;退出状态摘要 | pezwIhA0e04 [00:02:01]、[00:42:13] |
| 3 天 | Google 退款尚未确认的购买 | IAP 5 文档 |
| 10 到 15 分钟;每 3 分钟 | 无变现内容的开局时长;首个里程碑之后的插屏广告间隔 | ILv7GzDgteQ(启发式规则) |
| 54998 到 55511 | iOS 远程性能分析所需的出站端口 | 6.3 Manual |
| 0.125 到 0.925 | 应用于屏幕摇杆数值的默认 Gamepad 摇杆死区 | 实测 |
Quality gates
质量门禁
- Measurable: every audit at 0 errors (warns justified); all ASTC; NUnit (
ImportedFormats,SafeAreaTests,TouchInputTests,MonetizationTests) failed == 0;TierDirectorTestssustained pass;budget_verdictandaab_findings0 errors;xcode_findingswithin budget;bundletool_sizesandcode_scan0 errors; on device,package_checkpass over 20 minutes or more.soak_verdict - Visual: tier and safe-area captures pass and were opened; before/after blur check for every Max Size drop.
image_checks
- 可衡量: 每项审计均为 0 个错误(警告均有合理依据);全部为 ASTC;NUnit(
ImportedFormats、SafeAreaTests、TouchInputTests、MonetizationTests)failed == 0;TierDirectorTests持续性能判定通过;budget_verdict和aab_findings均为 0 个错误;xcode_findings在预算内;bundletool_sizes和code_scan均为 0 个错误;在设备上,package_check在 20 分钟或更长时间内通过。soak_verdict - 视觉: tier 和安全区捕获结果通过 且已打开检查;每次降低 Max Size 前后都要进行模糊度检查。
image_checks
Common mistakes
常见错误
| Mistake | What it looks like | Fix |
|---|---|---|
| profiling against 16.7 ms in the Editor | fine on the Mac, throttles after 10 minutes on a phone | 65% budget, device soak, p95/max |
| PC Quality level on the mobile target | captures use | |
| thermal response by resolution on a CPU-bound game | blurrier, barely faster | render scale only when GPU-bound; lodBias, shadows |
| RGBA32 override; HDR map without ASTC HDR | 5.3 MB for 1024 px; HDR imported as ETC2_RGBA8 | |
| streaming small clips; music Decompress On Load | 200 KB overhead per stream; whole PCM in memory | |
| keystore set once in the GUI | next batch build fails, or ships debug-signed | env vars read by |
| Development Build uploaded; symbols uploaded late | upload fails; early crashes never symbolicated | |
Gradle edits in | stale outputs from incremental builds | |
saves in | ANRs on pause; slow start under the splash | checkpoints; stagger SDK init; |
| IAP 4 code on IAP 5; LevelPlay 8 folders left | compile errors; pre-9 SDK files beside the 9.x package | pin packages, |
| a | retry with the kept |
| attribution SDK blind after IAP 5 | iOS revenue missing, no error | |
reward granted in | missing rewards; validation calls in release | |
| HUD anchored to the canvas; Simulator taken as proof | buttons under the notch; multitouch untested | |
| hiding the HUD when any Gamepad connects | the HUD hides itself: its own on-screen controls add a virtual Gamepad | |
| a declared privacy category | Unity's reasons for it dropped (0A2A.1, observed) | |
| 789.8 MB for a 53.9 MB AAB (observed) | |
| 错误 | 表现 | 修复 |
|---|---|---|
| 在 Editor 中以 16.7 ms 为基准做性能分析 | 在 Mac 上表现良好,但在手机上 10 分钟后会降频 | 使用 65% 预算、设备浸泡测试以及 p95/max |
| 移动目标使用 PC Quality level | 捕获结果使用 | |
| 对 CPU 受限游戏采用降低分辨率的热响应 | 画面更模糊,性能几乎没有提升 | 仅在 GPU 受限时降低 render scale;调整 lodBias 和阴影 |
| RGBA32 override;HDR 贴图缺少 ASTC HDR | 1024 px 下为 5.3 MB;HDR 被导入为 ETC2_RGBA8 | |
| 对小片段使用 Streaming;音乐使用 Decompress On Load | 每个 stream 增加 200 KB 开销;完整 PCM 常驻内存 | |
| 在 GUI 中只设置一次 keystore | 下一次批处理构建失败,或发布的是 debug 签名版本 | 由 |
| 上传 Development Build;符号文件上传过晚 | 上传失败;早期崩溃无法符号化 | |
在 | 增量构建留下过期输出 | |
在 | 暂停时发生 ANR;在启动画面期间启动缓慢 | 使用存档检查点;错开 SDK 初始化; |
| IAP 5 中仍使用 IAP 4 代码;遗留 LevelPlay 8 文件夹 | 编译错误;9.x 包旁残留 pre-9 SDK 文件 | 固定包版本,执行 |
将 | | 使用保留的 |
| IAP 5 后归因 SDK 仍处于盲态 | iOS 收入缺失且没有报错 | 先调用 |
在 | 奖励未发放;发布版中仍会调用验证接口 | |
| HUD 锚定到 canvas;把 Simulator 当作证明 | 按钮被刘海遮挡;未测试多点触控 | |
| 连接任意 Gamepad 时隐藏 HUD | HUD 会自行隐藏:其屏幕控件会添加虚拟 Gamepad | |
| 声明了隐私类别 | Unity 丢弃了对应理由(0A2A.1,实测) | |
将 | 53.9 MB 的 AAB 却显示为 789.8 MB(实测) | |
Handoffs
交接
- Receives: scenes, prefabs and budgets from scenario-unity-expert; UI layouts from scenario-unity-ui (applies the safe-area panel and touch HUD); shaders from scenario-unity-shaders (variants, depth/opaque texture use); content from scenario-unity-world-building and scenario-textures (import policy).
- Delivers: tier assets and URP findings to scenario-unity-rendering-lighting; profiling CSVs and device capture requests to scenario-unity-performance; build jobs, keystore and env conventions to scenario-unity-pipeline-automation (CI); input bindings to scenario-unity-architecture; web size or browser work to scenario-unity-web. Packet: audits JSON, contact sheets, and gates,
aab_factsand gates, NUnit totals, Verified and Assumed lists, the device and store checklist.xcode_facts
- 接收: 来自 scenario-unity-expert 的场景、prefab 和预算;来自 scenario-unity-ui 的 UI 布局(应用安全区面板和触控 HUD);来自 scenario-unity-shaders 的 shader(变体、depth/opaque texture 使用);来自 scenario-unity-world-building 和 scenario-textures 的内容(导入策略)。
- 交付: 向 scenario-unity-rendering-lighting 交付 tier assets 和 URP 发现结果;向 scenario-unity-performance 交付性能分析 CSV 和设备捕获请求;向 scenario-unity-pipeline-automation(CI)交付构建任务、keystore 和环境变量约定;向 scenario-unity-architecture 交付输入绑定;向 scenario-unity-web 交付 Web 体积或浏览器相关工作。交付包:审计 JSON、contact sheets、和门禁、
aab_facts和门禁、NUnit 总数、Verified 和 Assumed 列表,以及设备与商店检查清单。xcode_facts
Unity 6.3 notes
Unity 6.3 注意事项
- Target API 36 for Play since 2026-08-31; min API 25 (26 in 6.5); Gradle 9.1.0 / AGP 9.0.0 in 6000.3.17f1+; GameActivity is the default entry point. The 6000.3.21f1 URP template ships Target API Automatic, APK output and a placeholder package id (observed): set all three. Engine libraries are 16 KB aligned (observed).
- edits custom modules only:
AndroidProjectFilesModifierdoes not compile in 6000.3.21f1 (observed). LevelPlay 9.5.1 adds AD_ID through its own post-generate hook (read in the source): clean-build after changing that setting.AndroidProjectFiles.UnityLibraryManifest - After ,
QualitySettings.SetQualityLevelstill returned the previous asset that frame (observed): readGraphicsSettings.currentRenderPipeline.QualitySettings.renderPipeline - App Store needs Xcode 26 and the iOS 26 SDK; 6.4 moves runtime libraries into (re-check post-process scripts). PVRTC removed in 6.4.
UnityRuntime.framework - Adaptive Performance is a core feature (); automatic control only with Android providers.
UnityEngine.AdaptivePerformance - is obsolete in 9.5.1 (
LevelPlay.SetConsent);LevelPlayPrivacySettingsis legacy for monetization since 2026-01-31.com.unity.ads
- Play 自 2026-08-31 起要求目标 API 36;最低 API 25(6.5 中为 26);6000.3.17f1+ 使用 Gradle 9.1.0 / AGP 9.0.0;GameActivity 是默认入口。6000.3.21f1 的 URP 模板默认使用 Target API Automatic、APK 输出和占位 package id(实测):这三项都必须设置。引擎库按 16 KB 对齐(实测)。
- 只能编辑自定义模块:
AndroidProjectFilesModifier在 6000.3.21f1 中无法编译(实测)。LevelPlay 9.5.1 通过自己的 post-generate hook 添加 AD_ID(源码中可见):更改该设置后执行干净构建。AndroidProjectFiles.UnityLibraryManifest - 调用 后,
QualitySettings.SetQualityLevel在同一帧仍返回上一个 asset(实测):应读取GraphicsSettings.currentRenderPipeline。QualitySettings.renderPipeline - App Store 要求 Xcode 26 和 iOS 26 SDK;6.4 将运行时库移入 (重新检查 post-process scripts)。PVRTC 在 6.4 中被移除。
UnityRuntime.framework - Adaptive Performance 是核心功能();只有使用 Android provider 时才能自动控制。
UnityEngine.AdaptivePerformance - 在 9.5.1 中已弃用(
LevelPlay.SetConsent);自 2026-01-31 起,LevelPlayPrivacySettings不再用于变现,属于旧版方案。com.unity.ads
References
参考资料
- : principles by source with timestamps, observations, and where sources disagree.
references/expert-notes.md - : M1 to M13 as copyable calls, each with its live test and recorded result.
references/procedures.md - : the rubric to judge budgets, tiers, assets, UI, builds, money code and hand-overs.
references/critique.md - : the same tasks through Unity, Xcode and store consoles.
references/gui-paths.md - : every source with credentials, URLs, best timestamps, and the revision history.
references/sources.md
- :按来源整理的原则,包含时间戳、实测结果以及来源存在分歧之处。
references/expert-notes.md - :M1 到 M13 的可复制调用,每个均附现场测试和记录结果。
references/procedures.md - :用于评审预算、tier、资源、UI、构建、支付代码和交接工作的评分准则。
references/critique.md - :通过 Unity、Xcode 和商店控制台执行相同任务的路径。
references/gui-paths.md - :每个来源均附访问凭据、URL、最佳时间戳和修订历史。
references/sources.md