很多 Unity 开发者有过这样的经历编辑器里一切正常一打包就出问题。场景没加进去、包名写错、图标是默认的 Unity Logo、真机黑屏、包体大得离谱、上架时被商店以 64 位支持或 targetSdk 不达标为由拒绝……这些问题大多不在代码里而出在发车前没做检查。可以把一次构建想象成一趟列车出站乘客场景是否上齐目的地平台是否正确车辆参数Player Settings是否合规行车模式Development / Release是否选对到站后是否验票构建后验证。下面按发车流程逐项过一遍。版本说明Unity 2022 及以前通过File Build Settings配置Unity 6 起改为File Build Profiles支持为同一平台创建多个配置档如 Dev / Release / 渠道包并可覆盖部分 Player Settings 和场景列表。下文的检查项在两者中都适用。第一站清点乘客 —— Scenes In Build检查项需要的场景都已加入列表点击Add Open Scenes或直接把场景拖进列表。未加入的场景在运行时用SceneManager.LoadScene加载会直接报错。第一个场景索引 0是启动场景通常是 Boot / Splash / Loading 场景而不是你最后一次调试用的关卡。剔除测试场景取消勾选或移除TestScene、Sandbox之类避免把调试内容和多余资源打进包。按索引加载的代码已核对如果代码里写了LoadScene(3)调整列表顺序后要同步检查。更推荐用场景名或常量管理。 使用 Addressables 管理的场景不需要放进 Scenes In BuildAddressables 会单独打包重复添加反而会导致资源冗余。第二站确认目的地 —— Platform选中正确平台并点击Switch Platform只选中不切换是无效的。切换平台会触发资源重新导入大项目可能耗时很长建议在开发初期就固定目标平台。安装了对应的平台模块在 Unity Hub 中为当前编辑器版本添加 Android Build Support含 OpenJDK、SDK NDK、iOS Build Support、WebGL Build Support 等。平台特有选项AndroidExport Project导出 Gradle 工程用于二次集成、Build App Bundle (Google Play)上架 Google Play 需要 AAB 格式。iOSUnity 生成的是 Xcode 工程签名和归档在 Xcode 中完成注意选择Run in Xcode as Release/Debug。Windows / Mac / Linux确认 Architecturex86_64 / ARM64 / Universal。WebGL留意压缩格式见第五站。 小技巧用Unity Accelerator或 Asset Pipeline 的缓存可以显著缩短切换平台时的重新导入时间。第三站车辆年检 —— Player Settings点击 Build Settings 左下角的Player Settings...这里是出问题最多的地方。1. 基础身份信息Company Name / Product NameProduct Name 就是安装后显示的应用名。Version对外显示的版本号如1.2.0。Bundle Version CodeAndroid/ BuildiOS每次上传商店都必须递增否则会被拒绝。Default Icon 及各尺寸图标别让用户看到 Unity 默认图标。Package Name / Bundle Identifier如com.yourcompany.yourgame。一经上架不可更改务必反复确认。2. 分辨率与显示Default Orientation竖屏游戏选 Portrait横屏选 Landscape Left / Auto Rotation避免横屏游戏竖着打开。全屏模式PCFullscreen Window / Exclusive Fullscreen / Windowed。Run In Background是否允许失去焦点时继续运行。刘海屏 / 安全区Android 的Render outside safe area需与 UI 适配方案配合。3. Splash Screen个人版Personal强制显示 “Made with Unity”Pro 及以上可关闭或自定义 Logo。确认启动画面背景色与首个场景衔接自然避免闪白或闪黑。4. Other Settings —— 核心技术参数配置项建议说明Scripting Backend移动端发布用IL2CPPMono 构建快适合调试IL2CPP 性能更好且是 iOS 与 Android 64 位的必选项Target ArchitecturesAndroid勾选ARM64Google Play 强制要求 64 位ARMv7 视兼容需求保留API Compatibility Level.NET Standard 2.1包体更小、跨平台性更好某些第三方库需要 .NET Framework 时再改Color Space按项目确定Linear 效果更准确但老设备OpenGL ES 2.0不支持中途切换会导致画面大变Graphics APIs按目标设备取舍Android 可选 Vulkan / OpenGLES3出现真机黑屏时首先排查这里Minimum API Level结合用户群设定过高会损失老设备用户Target API Level满足商店当年要求Google Play 每年都会提高 targetSdk 门槛Managed Stripping Level从 Minimal 起逐步提高裁剪过度会把反射使用的代码删掉导致运行时报错需用link.xml保留Scripting Define Symbols区分环境例如为 Release 去掉ENABLE_CHEAT、DEBUG_LOG⚠️Stripping 踩坑提示使用 JSON 序列化库、依赖注入框架或反射时构建后报MissingMethodException或类型找不到多半是被裁剪了。在Assets下添加link.xmllinkerassemblyfullnameAssembly-CSharppreserveall/assemblyfullnameNewtonsoft.Jsonpreserveall//linker5. Publishing SettingsAndroid 签名Release 包必须使用自定义 Keystore默认的 Debug 签名无法上架。妥善备份 Keystore 文件和密码丢失后无法以同一身份更新应用使用 Play App Signing 可以降低风险。MinifyR8/ProGuard开启后注意为 SDK 添加混淆保留规则。不要把密码明文提交到版本库CI 中可通过环境变量注入。第四站选择行车模式 —— Development Build 与相关选项选项作用Release 包Development Build包含调试符号左下角显示 Development Build 水印❌ 关闭Autoconnect Profiler启动时自动连接 Profiler❌Deep Profiling Support记录所有函数调用开销很大❌Script Debugging允许挂载调试器❌Wait For Managed Debugger启动时等待调试器连接❌发正式包前确认 Development Build 已关闭。这是最常见的失误之一包体变大、性能下降、还会暴露水印。性能测试请用非 Development 包或仅开 Profiler 连接Deep Profiling 下的数据不能代表真实性能。第五站行李限重 —— 压缩与包体Compression MethodDefault不额外压缩Android 的 APK 本身是 zip。LZ4解压快适合开发与多数正式包。LZ4HC压缩率更高、构建更慢推荐用于正式发布。WebGL 压缩Brotli 压缩率最高但需要 HTTPS 和服务器正确配置Content-Encoding服务器配置不了时可开启Decompression Fallback。纹理压缩格式Android 推荐 ASTC老设备回退 ETC2iOS 使用 ASTC。分析包体构建后查看 Editor LogConsole 右上角菜单 → Open Editor Log里面有按类别列出的资源大小统计也可以使用 Build Report Inspector 等工具找出超重行李。检查Resources文件夹其中所有资源无论是否被引用都会被打包。第六站沿途设施 —— 相关联的设置Build Settings 之外以下设置同样影响构建结果Quality Settings为目标平台指定默认质量等级移动端别默认使用 Ultra。Graphics Settings / URP Asset检查 Always Included Shaders 和 Shader Stripping防止 Shader 变体爆炸导致构建时间长、包体大或运行时 Shader 丢失变成粉色。Addressables发版前执行Build New Build或 Update a Previous Build 用于热更新并确认 Profile 中的远程加载路径指向正式服务器而不是测试地址。第三方 SDKAndroid 依赖冲突可用 External Dependency Manager 处理iOS 检查 CocoaPods 是否正常生成。第七站自动化发车 —— 用脚本固化流程人工检查难免疏漏把配置写进脚本是最可靠的方式也方便接入 Jenkins、GitHub Actions 或 Unity Build Automation。// Assets/Editor/BuildScript.csusingSystem.Linq;usingUnityEditor;usingUnityEditor.Build.Reporting;usingUnityEngine;publicstaticclassBuildScript{[MenuItem(Build/Android Release)]publicstaticvoidBuildAndroidRelease(){// —— 发车前检查 ——PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android,ScriptingImplementation.IL2CPP);PlayerSettings.Android.targetArchitecturesAndroidArchitecture.ARM64;PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android,RELEASE);EditorUserBuildSettings.buildAppBundletrue;// 签名信息从环境变量读取避免明文写入仓库PlayerSettings.Android.useCustomKeystoretrue;PlayerSettings.Android.keystoreNameSystem.Environment.GetEnvironmentVariable(KEYSTORE_PATH);PlayerSettings.Android.keystorePassSystem.Environment.GetEnvironmentVariable(KEYSTORE_PASS);PlayerSettings.Android.keyaliasNameSystem.Environment.GetEnvironmentVariable(KEY_ALIAS);PlayerSettings.Android.keyaliasPassSystem.Environment.GetEnvironmentVariable(KEY_PASS);// 只打包已勾选的场景string[]scenesEditorBuildSettings.scenes.Where(ss.enabled).Select(ss.path).ToArray();if(scenes.Length0){Debug.LogError(❌ 没有任何场景被加入构建);return;}varoptionsnewBuildPlayerOptions{scenesscenes,locationPathNameBuilds/Android/MyGame.aab,targetBuildTarget.Android,optionsBuildOptions.CompressWithLz4HC// 不包含 Development};BuildReportreportBuildPipeline.BuildPlayer(options);BuildSummarysummaryreport.summary;if(summary.resultBuildResult.Succeeded)Debug.Log($✅ 构建成功{summary.totalSize/1024f/1024f:F2}MB耗时{summary.totalTime});elseDebug.LogError($❌ 构建失败{summary.result}错误数{summary.totalErrors});}}注较新版本的 Unity 推荐使用NamedBuildTarget相关 API如PlayerSettings.SetScriptingBackend(NamedBuildTarget.Android, ...)旧的BuildTargetGroup重载已标记为过时。Unity 6 也可以通过BuildProfile资产配合脚本切换配置。命令行调用示例Unity-batchmode-quit-projectPath./MyGame\-executeMethodBuildScript.BuildAndroidRelease\-logFilebuild.log还可以借助IPreprocessBuildWithReport在构建前自动检查一旦不合规就中止构建usingUnityEditor;usingUnityEditor.Build;usingUnityEditor.Build.Reporting;publicclassPreBuildChecker:IPreprocessBuildWithReport{publicintcallbackOrder0;publicvoidOnPreprocessBuild(BuildReportreport){boolisDev(report.summary.optionsBuildOptions.Development)!0;if(!isDevPlayerSettings.applicationIdentifier.Contains(test))thrownewBuildFailedException(Release 包的包名中包含 test请检查);}}终点站到站验票 —— 构建后验证构建成功不等于可以发布真机安装测试尤其是低端机和不同系统版本。冷启动首次安装后启动是否正常是否黑屏或卡在 Splash。场景跳转全流程走一遍确认没有遗漏场景。查看真机日志Android 用adb logcat -s UnityiOS 看 Xcode 控制台。检查包体大小是否在预期范围内。覆盖安装旧版本确认存档与升级逻辑正常。网络与 SDK登录、支付、广告、统计是否指向正式环境。 一页纸速查清单□ 场景所需场景已加入索引 0 为启动场景测试场景已移除 □ 平台已 Switch Platform模块已安装 □ 身份应用名 / 包名 / 版本号 / 构建号已递增/ 图标 □ 显示屏幕方向、分辨率、Splash □ 技术IL2CPP、ARM64、Color Space、Graphics API、Target API Level □ 裁剪Stripping 级别合适link.xml 已配置 □ 签名Release Keystore 已配置并备份 □ 模式Development Build 已关闭 □ 压缩LZ4 / LZ4HC纹理格式正确 □ 关联Quality、Shader、Addressables 路径、宏定义 □ 验证真机测试、日志检查、包体检查、全流程检查结语构建配置看起来琐碎但每一项背后都可能是一次凌晨被叫起来紧急修包的教训。比较好的做法是初期定方向尽早确定目标平台、Color Space、Scripting Backend这些越晚改代价越大。中期建清单团队共享一份检查表每次发版逐项打勾。长期靠自动化把配置写进构建脚本和预处理检查让流程不再依赖个人记忆。每次发车前多花五分钟检查能省下很多事后排查的时间。