本指南概述了典型的游戏开发周期。阅读本指南后,您可能会发现它作为参考也很有帮助。
使用 Unity 进行开发时,开发生命周期包括三个阶段
- 规划和设计
- 开发和测试
- 发布和维护
规划和设计
在规划和设计阶段,您确定如何构建游戏。您将决定如何应对移动开发挑战,并确定在开发中使用的工具和流程。
获取所有团队成员的输入
与您的美术、工程、设计、音频和制作团队合作,确定并记录实施任务。例如
- 美术团队可以为角色和环境创建资源纹理和网格预算。
- 工程团队可以确定针对每个平台的性能分析的内存和性能检查点。
- 设计团队可以规划实现体验的游戏机制。
- 音频专家可以审查 UI、2D 和 3D 空间音效之间声音连续性的要求。
- 制作团队可以传达发布要求,并使团队保持一致和步入正轨。
移动设备设计
移动平台应用开发涉及特定的考量因素,例如
- 可变屏幕宽高比
- 功耗
- 散热和处理器节流
- 触摸输入
- 跨平台开发
- 图形 API(Vulkan 或 OpenGL ES)
有关移动设计独特考量因素的详细信息,请参阅 Unity 提供的《Unity 中的 Android 开发》以及 Google Play Academy。
开发和测试
在开发和测试阶段,您构建游戏并进行测试和预发布准备。您在 Google Play 上进行一些有限的内部测试,为满足发布要求做准备。您根据 Play Asset Delivery 和 Unity Addressables 系统,在 Unity 中完善您的部署策略和组织资源。
以下部分介绍了旨在帮助您进行 Android 开发的 Unity 工具和技术。
渲染
渲染是将 Unity 场景中的 3D 和 2D 资源绘制到屏幕上的过程。虽然 Unity 引擎负责渲染,但考虑 Android 平台的一些因素很重要。
纹理
根据您的目标设备,确定是否需要最大的纹理尺寸。在分析内存分配时,请查看更改目标纹理尺寸可能带来的节省。
帧时间
为防止 Android 设备过热,平均帧时间值应低于 21 毫秒。有时,例如在加载或短片电影体验期间,您的帧时间可能会超过 21 毫秒,但对于核心游戏体验,您应保持在 21 毫秒阈值以下。
在移动平台上,如果您未达到最低目标帧率,强制 VSync 会限制帧率。例如,在 60Hz 屏幕更新下,如果您未达到 60fps,您的游戏将被限制到 30fps;如果您未达到 30fps,则将被限制到 15fps。
许多 Android 设备都提供 60Hz 和 120Hz 的显示刷新率。权衡是否应以更小的帧时间(60Hz 更新目标为 10ms,120Hz 目标为 5ms)为目标,同时避免更高渲染率带来的热节流和电池耗尽风险。
要在 Unity 中设置游戏的特定帧率,请使用 Application.targetFrameRate。
当您的应用呈现下一帧所需时间超过屏幕刷新率要求时,Android 帧同步库可帮助您平滑渲染。对于 Unity 2021 及更高版本,启用 Android 帧同步会将显示刷新率设置为与目标帧率最佳匹配的值。这可确保游戏不会在不必要的显示更新上浪费电池电量。
要启用该库,请在 Project Settings > Player 下的 Settings for Android 中,勾选 Optimized Frame Pacing 复选框。

Vulkan API
Vulkan 是一种跨平台、高性能的 3D 图形 API,与 OpenGL ES 相比开销较低。Unity 可以通过两种不同的方式使用 Vulkan。
自动图形 API
您可以将自动图形 API 与 Vulkan 配合使用,但这可能会根据您安装的 Unity 版本而有不同的行为。您可以通过导航到 Project Settings > Player > Rendering 来选择此项。
选择要使用的 Unity 版本时,请记住以下注意事项
- Unity 2021.1 及更早版本不支持自动图形 API 与 Vulkan 配合使用。Unity 尝试使用 OpenGL ES 3.2。如果设备不支持 OpenGL ES 3.2,Unity 将依次回退到 OpenGL ES 3.1、3.0 或 2.0。
- Unity 2021.2 及更高版本优先使用 Vulkan。如果设备不支持 Vulkan,Unity 将回退到 OpenGL ES 3.2、3.1、3.0 或 2.0。

手动图形 API
此外,您可以通过禁用自动图形 API 来手动启用 Vulkan。如果您正在使用 Unity 2021.1 或更早版本,这是使用 Vulkan 的唯一方法。
如果 Vulkan 在此列表中排序高于 OpenGL ES,Unity 将首先尝试使用 Vulkan。如果设备不支持 Vulkan,Unity 将运行 OpenGL ES。有关 Android 上 Vulkan 的详细信息,例如如何使用现代图形 API 和优化游戏性能,请参阅Vulkan 入门。

绘制调用
屏幕上显示的所有内容都与一个或多个绘制调用相关联。在移动平台上,您应该优化并减少发送到图形处理单元 (GPU) 的绘制调用数量。
将绘制调用想象成在交通灯前排队的汽车。绿灯亮后,一定数量的汽车可以在灯变色前通过。当灯变黄时,您已达到理想目标帧时间(21 毫秒),当灯变红时,您已达到 33 毫秒的帧时间限制。任何超过此时间都会影响下一个渲染帧,因此最终帧率会低于您目标 30fps。
有关如何提高游戏中绘制调用性能的信息,请参阅 Unity 支持的批处理文章。
阴影
投射阴影的绘制调用可能是最消耗 GPU 的,即使对于简单的环境,也会消耗大部分 GPU 时间。为了降低投射阴影绘制调用的成本,请尝试使用硬阴影而不是软阴影。如果对于低端设备来说,这在 GPU 上仍然开销过大,请考虑使用斑点阴影而不是硬阴影。
纹理
Android 上 RGB 和 RGBA 纹理的推荐纹理压缩格式是 ASTC。在 Unity 中,您应该在 Android 上使用的最低纹理压缩选项是 ETC2。您可以在 Unity Build Settings 下将 ETC2 作为 ASTC 的备用方案。
在 Unity 文档的手册:按平台划分的推荐、默认和支持的纹理格式中查找按平台支持的完整格式列表。
用户界面和宽高比
您可以使用 Unity 设备模拟器工具直接在 Unity 编辑器中预览各种设备屏幕分辨率、方向和宽高比。您可以在游戏视图和设备模拟器视图之间切换。
在在 Unity 中使用设备模拟器模拟您的游戏!查看该工具的预览。

您可以在 Github 上的 games-samples 仓库中找到 Trivial Kart 源代码。
您可以通过在下拉菜单中选择设备选项,快速验证设备模拟器视图中 UI 画布元素的布局和正确性


有关 Unity 的更多 UI 优化技术,请参阅 Unity 的以下教程:优化 Unity UI。
物理
Nvidia PhysX 引擎内置于 Unity 中。默认设置在移动设备上可能开销较大,因此请记住以下考量因素
- 考虑您的目标帧率并相应地设置固定时间步长。默认设置为 0.02 毫秒或 50Hz。对于 30fps 目标,您可以将其增加到 0.03 或更高。
- 考虑简化网格碰撞器并最小化图层碰撞矩阵,以确定特定图层类型的游戏对象之间的交互。
有关物理设置和移动游戏优化信息,请参阅 Unity 的《优化您的移动游戏电子书》。
性能分析
应用开发者通常会忽视或忽略性能分析,直到应用达到关键故障点。最好在您的流程中安排专门的性能分析时间,并使用以下最佳实践
- 在开发过程中确定可以分配性能分析时间的关键点,而不是随意插入。
- 保存配置文件快照以与 Unity Profile Analyzer 一起使用。
- 在目标设备上分析您的游戏,以准确了解您的游戏在当前开发阶段的表现。
- 分析您游戏的不同部分。
- 分析玩家如何玩游戏。(不要只在游戏处于空闲状态或暂停屏幕时才进行性能分析。)
- 在游戏运行一段时间后以持续模式进行性能分析,以帮助发现移动设备发热时可能遇到的节流问题。
您可以单独使用或组合使用以下性能分析工具。
Unity Profiler Unity Profiler 是一个完全集成的性能分析工具,可以在 Unity 编辑器中针对您的代码运行,并连接到运行开发模式构建的独立 Android 设备。
Android GPU Inspector 使用 Android GPU Inspector (AGI),您可以执行帧级调试。AGI 还会分析系统服务,包括 GPU、CPU、内存、电池和 GPU 计数器。
有关在 Unity 中分析游戏的详细信息,请观看 Unity 的视频Unity 性能分析简介或阅读《Unity 游戏性能分析终极指南》。
内存管理
Android 进程共享目标设备上的可用内存。当目标测试设备有足够的可用内存资源时,您应该对内存使用情况进行性能分析。在游戏的固定点执行内存测试,以便您可以适当地比较会话和内存使用趋势。
当您在 C# 脚本中工作时,请谨慎使用字符串、字符串比较以及字符串相关对象(例如用于游戏设置的 JSON 文件)的分配。这些会产生频繁的内存分配,并可能导致碎片化。
对于大量的字符串操作序列,请考虑使用 StringBuilder 类,而不是原地字符串连接(例如 "this" + "is" + "a" + "bad" + "idea" 与 StringBuilder.Concat()
函数调用)。
有关字符串的更多信息,请参阅 Unity 文档中的字符串和文本。
根据优先的 ScriptableObject
类型评估 TextAsset 和 JSON 文本资源。ScriptableObjects
可以高效地处理跨场景数据存储,并允许在编辑器到播放时间进行修改。
有关使用替代默认 JSON 处理以进行移动优化的讨论,请参阅 Hutch 上的文章网络游戏中隐藏的优化。
使用 Memory Advice API 来确定运行时内存使用情况。该 API 暴露了高、正常和低内存使用情况的红绿灯指示器。您可以订阅该指示器以获取更新,或直接轮询以获取当前状态。当您收到红色信号时,请考虑减少游戏对象池或缓存。在实时操作期间和发布后查看性能指标时,请将此上下文包含在您的游戏遥测数据中。
要深入了解 Android 设备上的内存组织以及 Unity 如何使用它,请观看了解 Android 内存使用情况(来自 Google I/O '18)。该视频详细介绍了内存问题的类型以及低内存终止器何时生效。
垃圾回收
在托管内存环境中,垃圾回收会清理未使用的内存碎片,这些碎片可以为应用程序回收。遵循垃圾回收最佳实践以避免不必要的内存资源分配。
例如,创建游戏对象池而不是使用按需分配(GameObject.Instantiate
)。对于大型对象池,请考虑跨多个帧进行分配,以降低游戏在入门级 Android 设备上无响应的风险。
考虑以下简单的协程代码片段,它从 MonoBehaviour 的开头调用
// Option 1: Bad for memory management - causes allocation each iteration
IEnumerator UpdateEnemyTarget() {
while (enabled) {
yield return new WaitForSeconds(1.0f);
// Some intermittent function check
}
}
// Option 2: Better for memory management - allocation of yield instruction once, reused each iteration
private YieldInstruction waitForSecond = new WaitForSeconds(1.0f);
IEnumerator BetterUpdateEnemyTarget() {
while (enabled) {
yield return waitForSecond;
// Some other intermittent function
}
}
您可以编辑 MonoBehaviour 模板文件以删除默认的 Start()
和 Update()
存根函数,这样您在开发时就不会无意中留下空函数。
有关 MonoBehaviour 事件执行顺序的概览,请参阅 Unity 文档中的事件函数执行顺序。要了解有关内存管理的更多信息,请参阅课程Unity 中的内存管理。
有关移动游戏性能优化技巧,请参阅优化您的移动游戏性能:来自 Unity 顶尖工程师的性能分析、内存和代码架构技巧。
Prefab 对象池
CPU 帧时间峰值几乎完全是由游戏过程中 Prefab 实例化引起的。考虑在进入游戏之前预热弹丸、可生成敌人和视觉效果的对象池,以减少或消除启动 CPU 峰值。您可以在场景加载或介绍序列期间,将额外的优化分散到多个“初始化帧”中。
您可以在 Unity Asset Store 上找到许多与游戏对象池管理相关的第三方对象池资源。您也可以创建自己的对象池。请参阅 Unity Learn 上的对象池简介。
资源交付
您的应用首次部署到 Google Play 时,其大小是有限制的。根据您游戏的大小和性质,您可能需要部分或全部游戏资源(角色模型、环境、UI 元素等),以便玩家获得您期望的体验。
您可以使用 Play Asset Delivery (PAD) 服务来管理游戏在安装时、快速跟随或按需所需的资源。Unity Asset Bundles 已集成以支持 PAD,您可以使用该工具指定要交付的元素。
Addressables
如果您准备并审查 Addressables 命名系统,则在运行时设置动态资源(例如预制件、纹理和声音文件)不再是复杂的操作。可寻址资源将您排列内容的方式与构建和加载内容的方式解耦。Addressables 系统取代了 Resources 文件夹和 Asset Bundles,以简化您在运行时引用和加载资源的方式。
有关示例,请参阅 GitHub 上的使用 Addressables 包的演示项目。有关 Addressables 开发的详细信息,请参阅 Unity 博客上的Addressable Asset System。
使用可寻址资源布局时,将过少或过多的资源打包到公共包中既有优点也有缺点。要了解有关使用 Addressables 进行内容管理的更多信息,请参阅使用 Addressables 简化您的内容管理。
您可以设置一个独立的演示并试验访问模式,以便熟悉 Addressables 系统。您还可以查看开源项目 BuildLayout Explorer for Unity 2019.3 及更高版本,并检查 Addressables 生成的 buildlayout.txt
报告。
Unity Open Project 中的 Chop Chop 游戏资源是使用 Addressables 系统打包的,用于所有加载和卸载操作。请参阅使用可寻址资源打包内容 | 开放项目开发日志,了解配置 Addressables bundle 的结构和设置的演练。
在 Chop Chop 项目中,默认加载的唯一场景(初始化场景)被配置为使用 AssetReferences
,而不是直接链接到项目中的资源(场景、预制件等)。
Unity 开放项目:Chop Chop 的源代码可在 GitHub 上获取。尽管该项目已不再开发,但其 git 仓库和文档仍然可用。
第三方插件
如果您使用第三方插件,例如 Unity Asset Store 中的插件,请务必审查文件夹并从 Resources 文件夹中删除不必要的资源。在构建过程中,Unity 会收集 Resources 文件夹中包含的所有资源,并将它们打包到一个可在运行时访问的单个包中。这可能会增加最终包的大小,而且通常不需要。
要快速定位所有资源文件夹,请在 Project 面板中搜索 Resources。然后您可以选择每个文件夹以识别其包含的内容以及您的游戏是否需要它。

发布和维护
当您准备好发布您的移动游戏时,请决定发布给谁、如何进行 alpha 和 beta 测试,以及发布后如何监控和跟踪性能。
分析有限发布的反馈
您可以向有限的、目标受众发布并进行更大规模的 beta 测试,或者在所有市场全面发布您的游戏。通过有限发布,您可以根据更广泛的真实用户和设备集合来调整您的应用程序性能。
例如,您可以使用适用于 Unity 的 Android Performance Tuner 和适用于 Unity 的 Google Analytics 来获取有关您的应用程序性能和玩家趋势的洞察,您的开发团队可以根据这些洞察进行调整和推送更新。您还可以使用您的分析数据来规划类似类型的续集或相关游戏。
Alpha 和 beta 测试
在 Google Play 管理中心设置您的应用配置文件后,您可以准备公开的 alpha 和 beta 测试版本,并将其分发给有限的受众进行发布前审查。通过向有限的受众发布,您可以使用更广泛的设备池解决任何最终问题,并收集初始反馈,以便在全球发布前进行响应。
您的 Unity 构建通过 Android App Bundle 分发。有关信息,请参阅 Unity 的手册:发布到 Google Play,其中也描述了从 APK 文件到 AAB 格式的更改。
监控和跟踪
在您游戏的实时运营和分发阶段,您可以使用Android Vitals 来帮助跟踪您在开发和测试期间可能无法访问的设备上的性能问题。有关详细信息,请观看Reach 和设备以及 Android vitals 中游戏的新功能。
通常,大型开发团队拥有独特且定制化的游戏遥测管道,提供与设备性能相关的指标。请记住利用 Android Performance Tuner (APT) 和相应的 Unity 插件来调整与帧率、图形保真度、加载时间以及加载放弃相关的指标。请按照将 Android Performance Tuner 集成到您的 Unity 游戏中的分步指南进行操作。
您的游戏生命周期不会在上线后停止。监控、维护和响应性能及反馈对于用户的满意度、积极的评价以及您的游戏在所有市场中的最终普及至关重要。