Unity多平台打包原理与流程
Unity多平台打包核心:同一套工程资源与C#业务代码,针对不同目标平台做编译转换、资源处理,输出对应平台可运行程序包。
底层:C++引擎内核做平台抽象;C#脚本根据平台选择Mono/IL2CPP后端;资源根据平台做纹理压缩、格式转换。
核心基础概念
- Scripting Backend(脚本后端)
- Windows/Mac编辑器:默认Mono
- 发布Android / iOS:强制使用 IL2CPP(AOT)
- WebGL:IL2CPP
- PC桌面Windows:可选Mono或IL2CPP
iOS不允许JIT,只能IL2CPP。
- 平台相关资源处理 打包时Unity自动处理资源:
- 纹理:不同平台使用不同纹理压缩格式(安卓ETC2,iOS PVRTC,PC BC)
- 模型、音频自动转平台适合格式
- Plugins文件夹按平台过滤,只打包对应平台原生插件(SDK aar/framework)
- 条件编译
#if UNITY_ANDROID
//安卓代码
#elif UNITY_IOS
//iOS代码
#elif UNITY_STANDALONE_WIN
//Windows
#elif UNITY_WEBGL
//网页
#else
//编辑器/其他平台
#endif
只在对应平台编译生效,编辑器不会执行被条件编译屏蔽的代码。
主流平台输出产物
| 目标平台 | 输出产物 | 脚本后端 | 备注 |
|---|---|---|---|
| Windows(PC) | .exe + Data文件夹 | Mono / IL2CPP | 可直接运行;也可打包安装包 |
| MacOS | .app应用包 | Mono / IL2CPP | 需要签名 |
| Android | APK / AAB | IL2CPP | AAB用于Google商店,APK本地安装 |
| iOS | Xcode工程文件夹 | IL2CPP | Unity不直接输出ipa;需要用Xcode编译签名出ipa |
| WebGL | html+js+wasm资源包 | IL2CPP | 浏览器运行,不支持多线程完整能力 |
⚠️iOS打包:Unity导出的是XCode工程,不是最终ipa;必须在Mac电脑打开Xcode,配置证书签名,编译生成ipa。Windows机器不能打包iOS。
完整通用打包流程
- 切换目标平台
File → Build Settings,选中目标平台,点击
Switch Platform。
Switch Platform会重新导入、转换全部资源,耗时较长;会修改工程内部资源导入设置。 不同平台纹理压缩、资源设置不一样,切换平台会重新处理资源。
- 配置Player Settings Edit → Project Settings → Player
- 包名(Bundle Identifier):Android applicationId、iOS BundleID,必须和SDK后台注册一致
- 版本号Version、Build号
- 图标、启动页Splash Screen
- 权限、支持设备方向(横屏/竖屏)
- IL2CPP配置:架构选择
- Android:ARM64(现代手机,必选),可选择x86_64模拟器
- iOS:ARM64
- Windows:x86‑64
配置Scripting Backend 移动端全部选择IL2CPP;勾选目标CPU架构。
插件配置Plugins Plugins/Android、Plugins/iOS,Inspector面板勾选对应平台,过滤其他平台。 SDK的aar、framework、so库只有目标平台打包才打进包。
Build Settings设置
- Add Open Scenes:把需要的场景加入打包列表
- 输出路径,点击Build / Build And Run。
各平台特殊要点
Android
- 可选择导出Gradle工程,或者直接输出APK/AAB。
- 自定义AndroidManifest,配置权限、SDK Activity。
- EDM4U管理第三方SDK Gradle依赖,解决版本冲突。
- 架构:现在主流只保留ARM64,32位ARMv7基本废弃。
- AAB上传GooglePlay;APK用于国内渠道测试。
iOS
- 必须Mac系统打包导出Xcode工程。Windows无法导出iOS可用工程。
- 导出完成后打开Xcode:配置BundleID、开发证书、Provisioning Profile签名。
- PostProcessBuild脚本自动修改XCode工程配置:增加framework、链接库、设置Swift版本。
- Info.plist配置权限、白名单,SDK需要的配置项。
- 最终Archive打包输出ipa。
Windows PC
- IL2CPP打包会生成大量C++源码,打包速度慢;Mono打包速度快。
- 输出exe和配套_Data文件夹,不能单独拷贝exe运行,整个文件夹一起分发。
WebGL
- 只支持IL2CPP;不支持多线程、部分系统API。
- 输出html、wasm、js;需要部署http服务器,不能直接双击本地html打开。
打包扩展:BuildPipeline / CI自动打包
Unity支持脚本化打包API,可以写Editor脚本实现一键打包,配合CI(GitHub Actions、Jenkins)自动化构建多平台包。
简单示例Editor脚本:
using UnityEditor;
public static class BuildTool
{
[MenuItem("Build/BuildAndroid")]
public static void BuildAndroid()
{
BuildPlayerOptions opts = new BuildPlayerOptions();
opts.scenes = EditorBuildSettings.scenes.Select(s=>s.path).ToArray();
opts.locationPathName = "Build/Android/test.apk";
opts.target = BuildTarget.Android;
opts.options = BuildOptions.None;
BuildPipeline.BuildPlayer(opts);
}
}
CI自动化打包适合多平台频繁构建,不用手动点编辑器。
多平台打包高频坑
切换平台很慢 Switch Platform会重新导入全部资源;大工程切换平台等待时间久。团队开发建议不要频繁来回切平台。
IL2CPP代码裁剪(Stripping) IL2CPP会裁剪没有直接引用的C#代码;SDK回调、反射、热更新dll用到的类会被删掉,线上闪退。 解决:配置
link.xml保留类不被裁剪。HybridCLR必须配置link.xml。平台资源不兼容 纹理压缩格式平台不同,不要强行跨平台复用导入设置。
SDK多平台插件错误打包 Plugins没有勾选平台,安卓包里打入iOS framework导致打包报错。
iOS导出Xcode工程被覆盖 每次重新导出会覆盖Xcode工程,不要手动修改Xcode工程设置!所有修改写PostProcessBuild脚本,否则重新导出全部丢失。
BundleID错误 登录、支付SDK校验包名,BundleID不对SDK直接初始化失败。
WebGL本地直接打开html报错 WebGL必须部署HTTP服务,浏览器禁止本地file协议加载wasm。
和热更新的关系
- 打包出来的APK/IPA里面的资源、AOT代码是固定的。
- Addressables资源、HybridCLR热更dll,是运行时从CDN下载,不属于打包阶段产物。
- SDK原生库、Manifest、Info.plist属于包本体,不能热更新,升级SDK版本必须重新打包发版。
最佳实践
- 业务代码尽量平台无关,平台差异全部隔离到统一接口,用条件编译封装。
- iOS所有XCode工程修改全部写PostProcessBuild,不手动改工程。
- Android用EDM4U管理SDK依赖,自定义Manifest。
- 大项目尽量做CI自动化打包,减少人工操作失误。
- 区分测试包与正式包:开关日志、调试SDK/正式SDK。
如果你需要,我可以给一份PostProcessBuild的示例代码,或者CI打包脚本模板。


0 条回复
还没有留言,来说点什么吧。