7.2 移动平台 (Android, iOS) 七、平台发布 7.2 移动平台 (Android, iOS) 移动平台,尤其是 Android 和 iOS,是当今游戏和应用发布最重要的阵地之一。Unity 提供了强大的跨平台能力,使得开发者能够相对轻松地将项目部署到这两个主流移动操作系统上。本章节将深入探讨 Unity 项目发布到 Android 和 iOS 平台的关键步骤、配置要点、代码实践以及性能优化策略。 7.2.1 环境准备与基础配置 在开始移动平台发布之前,我们需要确保开发环境已正确配置。这包括安装必要的 SDK、配置 Unity 项目设置以及了解平台特定的要求。 7.2.1.
移动平台,尤其是 Android 和 iOS,是当今游戏和应用发布最重要的阵地之一。Unity 提供了强大的跨平台能力,使得开发者能够相对轻松地将项目部署到这两个主流移动操作系统上。本章节将深入探讨 Unity 项目发布到 Android 和 iOS 平台的关键步骤、配置要点、代码实践以及性能优化策略。
在开始移动平台发布之前,我们需要确保开发环境已正确配置。这包括安装必要的 SDK、配置 Unity 项目设置以及了解平台特定的要求。
安装 Java Development Kit (JDK): Android SDK 需要 JDK 才能正常工作。请从 Oracle 官网下载并安装 JDK。建议使用 JDK 8 或更高版本。
安装 Android SDK: Android SDK 包含了构建 Android 应用所需的工具、库和平台版本。您可以通过以下几种方式安装 Android SDK:
Android Studio: 安装 Android Studio 是推荐的方式,它集成了 SDK 管理器,可以方便地下载和管理 SDK 组件。
独立 SDK Tools: 您可以单独下载 SDK Tools,并手动配置环境变量。
Unity Hub: Unity Hub 允许您在安装 Unity 编辑器时选择包含 Android Build Support 模块,并自动配置 SDK(通常是最小化版本)。
配置 Unity Android SDK 路径:
打开 Unity 编辑器,选择 "Edit" -> "Preferences" (Windows) 或 "Unity" -> "Preferences" (macOS)。
在弹出的窗口中,选择 "External Tools" 选项卡。
在 "Android" 部分,找到 "SDK"、"NDK" 和 "JDK" 的路径设置。
如果您安装了 Android Studio,Unity 通常会自动检测到 SDK 路径。如果没有,您需要手动指定 Android SDK 的安装路径。JDK 路径通常也会自动检测,如果未检测到,请手动指定 JDK 安装目录。NDK 通常与较新版本的 Unity 一起捆绑提供,如果需要自定义 NDK 版本,也可以在此处指定路径。
配置 Android 模块: 确保您的 Unity 项目已安装 "Android Build Support" 模块。您可以在 Unity Hub 的 "Installs" 选项卡中,选择您使用的 Unity 版本,点击 "Add modules",检查并安装 "Android Build Support" 模块。
安装 Xcode: iOS 开发必须在 macOS 系统上进行,并且需要安装 Xcode。Xcode 是 Apple 官方提供的集成开发环境 (IDE),包含了 iOS SDK、模拟器以及构建和打包 iOS 应用所需的工具。您可以从 Mac App Store 免费下载 Xcode。
Apple Developer 账号: 要将应用发布到 App Store 或在真机上进行测试,您需要拥有 Apple Developer 账号。个人开发者和公司开发者账号有所不同,请根据您的需求选择注册。
配置 Unity iOS Build Support: 类似于 Android,确保您的 Unity 项目已安装 "iOS Build Support" 模块。在 Unity Hub 中检查并安装该模块。
Unity 的 Player Settings 是配置移动平台构建的关键部分。在这里,您可以设置应用图标、包名、版本号、屏幕方向、渲染设置、权限请求等重要参数。
在 "Edit" -> "Project Settings" -> "Player" 中,您可以找到 Player Settings。在左侧面板中,选择 "Android" 或 "iOS" 平台图标,即可进入平台特定的设置页面。
Company Name & Product Name: 这些设置会影响应用的包名(Android)和 Bundle Identifier (iOS)。请确保填写正确的公司和产品名称。
Version: 设置应用的版本号和 Build Number。版本号用于标识公开版本,Build Number 用于内部迭代管理。
Icon: 为应用设置不同尺寸和分辨率的图标。请务必提供所有需要的图标尺寸,以确保应用在不同设备上显示效果良好。
Splash Image: 配置应用的启动画面。您可以设置静态图片或 Unity Splash Screen。
Identification:
Package Name: Android 应用的唯一标识符,通常采用反向域名格式,例如 com.yourcompany.yourproductname。Package Name 必须唯一且符合规范。
Version Code: 整数类型的版本号,用于区分应用的不同构建版本。每次发布新版本时,Version Code 必须递增。
Version Name: 用户可见的版本号,例如 1.0.0。
Configuration:
Scripting Backend: 选择脚本后端。
Mono: 传统的脚本后端,兼容性好,但性能相对较差。
IL2CPP: 将 C# 代码转换为 C++ 代码,然后编译为本地代码。性能更高,安全性更好,但构建时间较长,且可能存在一些兼容性问题。对于移动平台,强烈推荐使用 IL2CPP。
Target Architectures: 选择目标 CPU 架构。
ARMv7: 32 位 ARM 架构,兼容大部分旧设备。
ARM64: 64 位 ARM 架构,性能更佳,是现代 Android 设备的主流架构。
x86 & x86_64: 通常用于模拟器或特定设备,移动设备上较少使用。
建议同时勾选 ARMv7 和 ARM64,以最大化设备兼容性。
Graphics API: 选择图形 API。
Auto Graphics API: Unity 自动选择最佳 API。
OpenGL ES 2.0/3.0: 常用的图形 API,兼容性好。
Vulkan: 现代图形 API,性能更高,但兼容性相对较新。
建议使用 Auto Graphics API 或 OpenGL ES 3.0。
Other Settings:
Rendering: 配置渲染相关的设置,例如颜色空间 (Color Space)、图形层级 (Graphics Tier) 等。
Optimization: 配置优化相关的设置,例如 Stripping Level (代码剥离级别)。
Internet Access: 如果应用需要访问网络,请设置为 "Require"。
Write Access: 控制应用的文件写入权限。通常选择 "External (SDCard)"。
Install Location: 指定应用的安装位置。通常选择 "Automatic"。
Minimum API Level & Target API Level: 设置应用支持的最低 Android API 版本和目标 API 版本。建议根据您的应用需求和目标用户群体选择合适的 API Level。Target API Level 应该尽可能高,以利用最新的 Android 系统特性和安全更新。
Publishing Settings:
Keystore: 配置用于签名 APK 文件的 Keystore。Keystore 对于 Android 应用的发布至关重要,请务必妥善保管您的 Keystore 文件和密码。
Create New Keystore: Unity 可以帮助您创建新的 Keystore。
Use Existing Keystore: 如果您已有 Keystore,可以选择使用现有的。
Password & Key Alias: 设置 Keystore 的密码和 Key Alias。
Identification:
Bundle Identifier: iOS 应用的唯一标识符,类似于 Android 的 Package Name,也采用反向域名格式,例如 com.yourcompany.yourproductname。
Version: 应用的版本号和 Build Number。
Build: iOS 的 Build Number 通常使用 "Build" 字段。
Build Settings:
Target SDK: 选择目标 SDK。
Device SDK: 构建真机设备使用的版本。
Simulator SDK: 构建模拟器使用的版本。
Architecture: 选择目标 CPU 架构。
ARM64: 64 位 ARM 架构,是现代 iOS 设备的主流架构。
Universal: 同时支持 32 位和 64 位架构 (已逐渐被 ARM64 取代)。
Stripping Level: 代码剥离级别,类似于 Android 的 Stripping Level。
Other Settings:
Rendering: 配置渲染相关的设置,例如颜色空间 (Color Space)、图形层级 (Graphics Tier) 等。
Optimization: 配置优化相关的设置。
Camera Usage Description & Microphone Usage Description & Location Usage Description 等: 如果应用需要访问相机、麦克风、定位等敏感权限,必须在此处添加用途描述。iOS 系统对用户隐私保护非常严格,务必提供清晰合理的用途描述,否则应用可能会被 App Store 拒绝。
Publishing Settings:
Signing: 配置代码签名相关的设置。iOS 应用的代码签名非常复杂,需要配置 Certificate、Identifier 和 Provisioning Profile。
Automatically manage signing: Xcode 可以自动管理签名,但需要您在 Xcode 中配置 Apple Developer 账号和 Team ID。
Manual Signing: 手动配置 Provisioning Profile 和 Signing Certificate。
Provisioning Profile: 用于描述应用的授权信息,包括 App ID、设备列表、权限等。
Signing Certificate: 用于对应用进行数字签名,证明应用的开发者身份。
虽然 Unity 提供了跨平台能力,但在移动平台上,Android 和 iOS 仍然存在一些差异。我们需要在代码中进行平台判断和处理,以确保应用在两个平台上的行为符合预期。
Unity 提供了 Application.platform 属性,可以获取当前运行的平台。
using UnityEngine; public class PlatformChecker : MonoBehaviour { void Start() { if (Application.platform == RuntimePlatform.Android) { Debug.Log("Running on Android"); // 执行 Android 平台特定的代码 } else if (Application.platform == RuntimePlatform.IPhonePlayer) { Debug.Log("Running on iOS"); // 执行 iOS 平台特定的代码 } else { Debug.Log("Running on other platform: " + Application.platform); // 执行其他平台通用的代码 } } }
您可以使用预编译指令 (#if UNITY_ANDROID 和 #elif UNITY_IOS) 在编译时根据平台选择性地包含代码。
using UnityEngine; public class PlatformSpecificCode : MonoBehaviour { void Start() { #if UNITY_ANDROID Debug.Log("Android specific code executed"); // Android 平台特定代码 ShowAndroidToast("Hello from Android!"); // 假设有一个显示 Android Toast 的方法 #elif UNITY_IOS Debug.Log("iOS specific code executed"); // iOS 平台特定代码 RequestiOSNotificationPermission(); // 假设有一个请求 iOS 通知权限的方法 #else Debug.Log("General code executed"); // 其他平台通用代码 #endif } #if UNITY_ANDROID // Android 平台特定方法 (需要调用 Android Java Plugin) void ShowAndroidToast(string message) { using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { using (AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) { using (AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast")) { AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject>("makeText", currentActivity, message, toastClass.GetStatic<int>("LENGTH_SHORT")); toast.Call("show"); } } } } #endif #if UNITY_IOS // iOS 平台特定方法 (需要调用 iOS Native Plugin) void RequestiOSNotificationPermission() { // 调用 iOS Native Plugin 代码请求通知权限 // ... (此处省略 iOS Native Plugin 的调用代码) Debug.Log("Requesting iOS Notification Permission (Placeholder)"); } #endif }
代码详解:
Application.platform: 这是一个运行时属性,可以在程序运行时动态获取当前平台。
预编译指令 (#if, #elif, #else, #endif): 这些指令在编译时起作用,允许您根据不同的平台编译不同的代码。这对于包含平台特定的 API 调用或优化代码非常有用。
Android Java Plugin: 在 #if UNITY_ANDROID 代码块中,我们展示了如何调用 Android Java Plugin 来显示 Android Toast 消息。这需要使用 AndroidJavaClass 和 AndroidJavaObject 类来与 Android Java 代码进行交互。
iOS Native Plugin: 在 #if UNITY_IOS 代码块中,我们 placeholder 了 iOS Native Plugin 的调用。iOS 平台特定功能通常需要通过 Native Plugin 来实现,例如访问 iOS 系统 API 或调用 Objective-C/Swift 代码。
完成项目配置和平台特定代码开发后,就可以进行构建和部署了。
切换平台: 在 "File" -> "Build Settings" 中,选择 "Android",然后点击 "Switch Platform"。
配置 Build Settings:
Scenes In Build: 确保将所有需要的场景添加到 "Scenes In Build" 列表中。
Target Platform: 确保设置为 "Android"。
Texture Compression: 选择合适的纹理压缩格式。ASTC 是推荐的通用格式,ETC2 是 Android 平台常用的格式。
Build System: 选择构建系统。Gradle (new) 是推荐的构建系统,功能更强大,易于集成 Android 库。
Build: 点击 "Build" 按钮,选择 APK 文件的保存路径,开始构建。Unity 会根据 Player Settings 和 Build Settings 生成 APK 文件。
部署到设备:
USB 调试: 将 Android 设备连接到电脑,确保设备已启用 USB 调试模式。
安装 APK: 使用 adb install your_app.apk 命令通过 ADB 工具安装 APK 文件到设备。或者,您可以直接将 APK 文件复制到设备,然后在设备上找到并安装。
Run on Device: 在 Build Settings 窗口中,您可以选择 "Build And Run",Unity 会自动构建并安装 APK 到连接的设备上并运行。
切换平台: 在 "File" -> "Build Settings" 中,选择 "iOS",然后点击 "Switch Platform"。
配置 Build Settings:
Scenes In Build: 确保将所有需要的场景添加到 "Scenes In Build" 列表中。
Target Platform: 确保设置为 "iOS"。
Architecture: 选择目标架构,通常选择 "ARM64"。
Target SDK: 选择目标 SDK,通常选择 "Device SDK"。
Build: 点击 "Build" 按钮,选择 Xcode Project 的保存路径,开始构建。Unity 会生成一个 Xcode Project 文件 (.xcodeproj 或 .xcworkspace)。
部署到设备:
打开 Xcode Project: 在 macOS 上,双击生成的 Xcode Project 文件打开 Xcode。
配置 Signing & Provisioning: 在 Xcode 中,选择您的 Target,然后在 "Signing & Capabilities" 选项卡中配置您的 Apple Developer 账号、Team ID、Bundle Identifier、Provisioning Profile 和 Signing Certificate。这是 iOS 应用部署的关键步骤,请务必正确配置。
选择设备或模拟器: 在 Xcode 的设备选择器中,选择您的 iOS 设备 (真机需要连接到 Mac) 或模拟器。
Build and Run: 点击 Xcode 的 "Play" 按钮 (Build and run the current scheme) 开始构建和部署。Xcode 会编译项目、安装应用到设备或模拟器并运行。
移动平台的性能通常比 PC 平台更受限制,因此性能优化至关重要。以下是一些移动平台性能优化的建议和注意事项:
资源优化:
纹理压缩: 使用合适的纹理压缩格式 (ASTC, ETC2, PVRTC) 减小纹理大小。
模型优化: 减少模型面数和顶点数。
音频压缩: 使用压缩的音频格式 (MP3, AAC, Vorbis)。
资源复用: 尽可能复用资源,例如使用材质共享 (Material Sharing) 和对象池 (Object Pooling)。
渲染优化:
减少 Draw Calls: 使用 Static Batching、Dynamic Batching 或 GPU Instancing 来减少 Draw Calls。
优化 Shader: 编写高效的 Shader,避免复杂的计算和不必要的 Pass。
控制 Overdraw: 减少 Overdraw,可以使用 Overdraw 视图模式进行分析。
LOD (Level of Detail): 使用 LOD 技术,根据物体距离调整模型细节度。
剔除 (Culling): 利用 Frustum Culling 和 Occlusion Culling 剔除不可见物体。
光照优化: 使用 Baked Lighting 减少实时光照计算,或者使用 Light Probe 和 Reflection Probe 优化动态物体的光照效果。
代码优化:
避免 Boxing 和 Unboxing: 减少值类型和引用类型之间的转换。
字符串操作优化: 避免频繁的字符串拼接,使用 StringBuilder。
使用协程 (Coroutine) 进行异步操作: 避免在主线程进行耗时操作,例如网络请求和资源加载。
减少 GC Alloc: 避免在 Update 循环中频繁创建和销毁对象,减少垃圾回收压力。
使用 Profiler 进行性能分析: 使用 Unity Profiler 或平台特定的 Profiler 工具 (例如 Xcode Instruments, Android Profiler) 分析性能瓶颈,并进行针对性优化。
平台特定注意事项:
Android 权限管理: 合理请求 Android 权限,并在代码中处理权限请求和授权状态。
iOS App Transport Security (ATS): 了解 iOS ATS 机制,确保应用的网络请求符合 ATS 要求。
iOS 内存管理: iOS 系统对内存管理比较严格,要注意内存泄漏和内存占用过高的问题。
屏幕适配: 移动设备屏幕尺寸和分辨率多样,需要做好屏幕适配,确保 UI 和游戏内容在不同设备上显示正常。
最终目标是将应用发布到应用商店 (Google Play Store 和 Apple App Store)。这涉及到应用商店的账号注册、应用信息填写、应用包上传、审核流程等。
Google Play Store 发布:
Google Play Console 账号: 注册 Google Play Console 开发者账号。
创建应用: 在 Google Play Console 中创建应用,填写应用信息 (应用名称、描述、图标、截图等)。
上传 APK 文件: 上传构建好的 APK 文件。
配置定价和分发: 设置应用的价格、分发地区等。
提交审核: 提交应用进行审核。
发布应用: 审核通过后,发布应用到 Google Play Store。
Apple App Store 发布:
App Store Connect 账号: 注册 Apple Developer Program 账号,并访问 App Store Connect。
创建 App Record: 在 App Store Connect 中创建 App Record,填写应用信息 (应用名称、副标题、描述、图标、截图、App 预览视频等)。
上传 IPA 文件: 通过 Xcode 或 Application Loader 上传构建好的 IPA 文件。
配置定价和分发: 设置应用的价格、分发地区等。
提交审核: 提交应用进行审核。
发布应用: 审核通过后,发布应用到 App Store。
总结:
本章节详细介绍了 Unity 项目发布到 Android 和 iOS 移动平台的关键步骤和注意事项,包括环境配置、Player Settings 设置、平台差异处理、构建部署、性能优化以及应用商店发布流程。掌握这些知识,您就可以成功地将您的 Unity 项目发布到移动平台,触达更广泛的用户群体。移动平台发布是一个涉及多个环节和细节的过程,希望本章节能为您提供清晰的指导和帮助。
未来展望:
随着移动技术和 Unity 引擎的不断发展,移动平台发布流程也在不断简化和优化。例如,Unity Cloud Build 提供了云端构建服务,可以自动化构建不同平台的应用包。未来,我们可以期待更便捷、更高效的移动平台发布工具和流程,帮助开发者更专注于内容创作本身。