Unity多平台打包原理与流程


Unity多平台打包核心:同一套工程资源与C#业务代码,针对不同目标平台做编译转换、资源处理,输出对应平台可运行程序包。

底层:C++引擎内核做平台抽象;C#脚本根据平台选择Mono/IL2CPP后端;资源根据平台做纹理压缩、格式转换。

核心基础概念

  1. Scripting Backend(脚本后端)
  • Windows/Mac编辑器:默认Mono
  • 发布Android / iOS:强制使用 IL2CPP(AOT)
  • WebGL:IL2CPP
  • PC桌面Windows:可选Mono或IL2CPP

iOS不允许JIT,只能IL2CPP。

  1. 平台相关资源处理 打包时Unity自动处理资源:
  • 纹理:不同平台使用不同纹理压缩格式(安卓ETC2,iOS PVRTC,PC BC)
  • 模型、音频自动转平台适合格式
  • Plugins文件夹按平台过滤,只打包对应平台原生插件(SDK aar/framework)
  1. 条件编译
#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。

完整通用打包流程

  1. 切换目标平台 File → Build Settings,选中目标平台,点击Switch Platform。

Switch Platform会重新导入、转换全部资源,耗时较长;会修改工程内部资源导入设置。 不同平台纹理压缩、资源设置不一样,切换平台会重新处理资源。

  1. 配置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
  1. 配置Scripting Backend 移动端全部选择IL2CPP;勾选目标CPU架构。

  2. 插件配置Plugins Plugins/Android、Plugins/iOS,Inspector面板勾选对应平台,过滤其他平台。 SDK的aar、framework、so库只有目标平台打包才打进包。

  3. Build Settings设置

  • Add Open Scenes:把需要的场景加入打包列表
  • 输出路径,点击Build / Build And Run。

各平台特殊要点

Android

  1. 可选择导出Gradle工程,或者直接输出APK/AAB。
  2. 自定义AndroidManifest,配置权限、SDK Activity。
  3. EDM4U管理第三方SDK Gradle依赖,解决版本冲突。
  4. 架构:现在主流只保留ARM64,32位ARMv7基本废弃。
  5. AAB上传GooglePlay;APK用于国内渠道测试。

iOS

  1. 必须Mac系统打包导出Xcode工程。Windows无法导出iOS可用工程。
  2. 导出完成后打开Xcode:配置BundleID、开发证书、Provisioning Profile签名。
  3. PostProcessBuild脚本自动修改XCode工程配置:增加framework、链接库、设置Swift版本。
  4. Info.plist配置权限、白名单,SDK需要的配置项。
  5. 最终Archive打包输出ipa。

Windows PC

  1. IL2CPP打包会生成大量C++源码,打包速度慢;Mono打包速度快。
  2. 输出exe和配套_Data文件夹,不能单独拷贝exe运行,整个文件夹一起分发。

WebGL

  1. 只支持IL2CPP;不支持多线程、部分系统API。
  2. 输出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自动化打包适合多平台频繁构建,不用手动点编辑器。

多平台打包高频坑

  1. 切换平台很慢 Switch Platform会重新导入全部资源;大工程切换平台等待时间久。团队开发建议不要频繁来回切平台。

  2. IL2CPP代码裁剪(Stripping) IL2CPP会裁剪没有直接引用的C#代码;SDK回调、反射、热更新dll用到的类会被删掉,线上闪退。 解决:配置link.xml保留类不被裁剪。HybridCLR必须配置link.xml。

  3. 平台资源不兼容 纹理压缩格式平台不同,不要强行跨平台复用导入设置。

  4. SDK多平台插件错误打包 Plugins没有勾选平台,安卓包里打入iOS framework导致打包报错。

  5. iOS导出Xcode工程被覆盖 每次重新导出会覆盖Xcode工程,不要手动修改Xcode工程设置!所有修改写PostProcessBuild脚本,否则重新导出全部丢失。

  6. BundleID错误 登录、支付SDK校验包名,BundleID不对SDK直接初始化失败。

  7. WebGL本地直接打开html报错 WebGL必须部署HTTP服务,浏览器禁止本地file协议加载wasm。

和热更新的关系

  1. 打包出来的APK/IPA里面的资源、AOT代码是固定的。
  2. Addressables资源、HybridCLR热更dll,是运行时从CDN下载,不属于打包阶段产物。
  3. SDK原生库、Manifest、Info.plist属于包本体,不能热更新,升级SDK版本必须重新打包发版。

最佳实践

  1. 业务代码尽量平台无关,平台差异全部隔离到统一接口,用条件编译封装。
  2. iOS所有XCode工程修改全部写PostProcessBuild,不手动改工程。
  3. Android用EDM4U管理SDK依赖,自定义Manifest。
  4. 大项目尽量做CI自动化打包,减少人工操作失误。
  5. 区分测试包与正式包:开关日志、调试SDK/正式SDK。

如果你需要,我可以给一份PostProcessBuild的示例代码,或者CI打包脚本模板。


21 8 月, 2026Garfield God学习笔记阅读 1 次

0 条回复

还没有留言,来说点什么吧。

留言