Unity 游戏开发入门

本指南概述了典型的游戏开发周期。阅读本指南后,您可能会发现将其用作参考也很有用。

使用 Unity 时,开发周期包括三个阶段

  • 计划和设计
  • 开发和测试
  • 发布和维护

计划和设计

在计划和设计阶段,您确定如何构建游戏。您决定如何应对移动开发的挑战,并确定开发中要使用的工具和流程。

获取所有团队成员的意见

与您的美术、工程、设计、音频和制作团队合作,识别和记录实施任务。例如

  • 美术团队可能会为角色和环境创建资源纹理和网格预算。
  • 工程团队可能会确定用于针对每个平台进行分析的内存和性能检查点。
  • 设计团队可能会计划支持体验的游戏机制。
  • 音频专家可能会审查 UI、2D 和 3D 空间声音之间声音连续性的要求。
  • 制作团队可能会传达发布要求,并使团队保持一致和按计划进行。

针对移动设备进行设计

针对移动平台的应用程序开发涉及一些特定的考虑因素,例如

  • 可变屏幕纵横比
  • 功耗
  • 热量和处理器限制
  • 触摸输入
  • 跨平台开发
  • 图形 API(Vulkan 或 OpenGL ES)

有关针对移动设备设计时独有考虑因素的详细信息,请参阅 Unity 的 Unity 中的 Android 开发Google Play 学院

开发和测试

在开发和测试阶段,您构建游戏并进行测试和预发布准备。您在 Google Play 上进行一些有限的 内部测试 以准备满足发布要求。您优化部署策略并在 Unity 中根据 Play Asset Delivery 和 Unity Addressables 系统组织资源。

以下部分描述了旨在帮助您开发 Android 的 Unity 工具和技术。

渲染

渲染是将 Unity 场景中的 3D 和 2D 资源绘制到屏幕上的过程。虽然 Unity 引擎处理渲染,但对于 Android 平台,务必考虑以下几个因素。

纹理

根据目标设备确定是否需要最大的纹理尺寸。当您分析 内存分配 时,请查看更改目标纹理尺寸的潜在节省。

帧时间

为了防止 Android 设备过热,平均帧时间值应低于 21 毫秒。有时,例如在加载或简短的过场动画体验期间,您的帧时间可能会超过 21 毫秒,但您应在核心游戏体验中保持低于 21 毫秒的阈值。

在移动平台上,如果未达到最低目标,强制 VSync 会限制帧率。例如,在 60Hz 屏幕更新上,如果未达到 60fps,则游戏会限制为 30;如果未达到 30,则会限制为 15。

许多 Android 设备出厂时都配备了 60Hz 和 120Hz 的显示屏刷新率。权衡针对更短的帧时间(60Hz 更新的目标为 10ms,120Hz 更新的目标为 5ms)的好处,而不会因更高的渲染率而导致热量限制和电池电量消耗。

要在 Unity 中的游戏中设置特定的帧率,请使用 Application.targetFrameRate

Android 帧速率调整库 可帮助您在应用程序呈现下一帧的时间比屏幕刷新率要求的时间长得多时流畅地渲染。对于 Unity 2021 及更高版本,启用 Android 帧速率调整会将显示屏刷新率设置为与目标帧率最匹配的刷新率。这确保游戏不会在不必要的显示更新上浪费电池电量。

要启用该库,请在**项目设置** > **播放器**下的**Android 设置**中选中**优化帧速率调整**复选框。

Dialog box showing Project Settings > Player Settings > Optimized Fame Pacing
图 1. 优化帧速率调整在 Unity 2019.2 及更高版本中的播放器设置下可用。

Vulkan API

Vulkan 是一种跨平台、高性能的 3D 图形 API,与 OpenGL ES 相比,它具有较低的开销。Unity 可以通过两种不同的方式使用 Vulkan。

自动图形 API

您可以将自动图形 API 与 Vulkan 一起使用,但这可能会根据您安装的 Unity 版本而产生不同的行为。您可以通过导航到**项目设置 > 播放器 > 渲染**来选择此选项。

在选择使用哪个 Unity 版本时,请牢记以下事项

  • Unity 2021.1 及更早版本不支持 Vulkan 与自动图形 API 结合使用。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。
Project Settings > Player Settings > Rendering > Auto Graphics API
图 2. 自动图形 API 设置。

手动图形 API

或者,您可以通过禁用自动图形 API 来手动启用 Vulkan。如果您使用的是 Unity 2021.1 或更早版本,这是使用 Vulkan 的唯一方法。

如果在此列表中 Vulkan 的顺序高于 OpenGL ES,则 Unity 会首先尝试使用 Vulkan。如果设备不支持 Vulkan,则 Unity 将使用 OpenGL ES 运行。有关 Android 上 Vulkan 的详细信息,例如如何使用现代图形 API 和优化游戏性能,请参阅 Vulkan 入门

Project Settings > Player Settings > Rendering > Graphics APIs
图 3. 在禁用自动图形 API 时手动设置图形 API。Vulkan 为首选项。Unity 回退到 OpenGL ES 3.0。

绘制调用

屏幕上显示的所有内容都与一个或多个绘制调用相关联。在移动平台上,您应该优化并减少发送到图形处理单元 (GPU) 的绘制调用数量。

可以将绘制调用想象成在交通信号灯前排队的汽车。信号灯变绿后,在信号灯再次变化之前,可以有特定数量的汽车通过。当信号灯变黄时,您已达到理想的目标帧时间(21 毫秒),当信号灯变红时,您已达到 33 毫秒的帧时间限制。超出此限制会影响下一帧的渲染,因此产生的帧率低于您的目标 30fps。

有关如何提高游戏中绘制调用性能的信息,请参阅 Unity 支持的 批处理 文章。

阴影

阴影投射绘制调用可能是最占用 GPU 的操作,即使在简单的环境中也可能消耗大部分 GPU 时间。为了降低阴影投射绘制调用的成本,请尝试使用硬阴影而不是软阴影。如果对于低端设备而言,这仍然过分占用 GPU,请考虑使用斑点阴影而不是硬阴影。

纹理

Android 上 RGB 和 RGBA 纹理的推荐纹理压缩格式为 ASTC。在 Unity 中,您应该在 Android 上使用的最低纹理压缩选项为 ETC2。您可以在 Unity 构建设置下将 ETC2 作为 ASTC 的备用选项。

在 Unity 文档中,您可以找到按平台列出的完整支持格式列表,网址为 手册:按平台推荐、默认和支持的纹理格式

用户界面和纵横比

您可以使用 Unity 的 设备模拟器 工具直接在 Unity 编辑器中预览各种设备屏幕分辨率、方向和纵横比。您可以在游戏视图和设备模拟器视图之间切换。

使用 Unity 中的设备模拟器模拟您的游戏! 中查看该工具的预览。

图 4. 设备模拟器正在运行 Trivial Kart。

您可以在 Github 上的 games-samples 存储库中找到 Trivial Kart 源代码。

您可以通过在下拉菜单中选择设备选项,快速验证设备模拟器视图中 UI 画布元素的布局和正确性。

Project Settings > Player Settings > Optimized Frame Pacing
图 5. 设备模拟器支持在编辑器中更改设备,因此您可以尽早发现设计问题。
Project Settings > Player Settings > Optimized Fame Pacing
图 6. 下载设备模拟器包之前,请选中启用预发布包

有关 Unity 的更多 UI 优化技巧,请参阅 Unity 的以下教程:优化 Unity UI

物理

Nvidia PhysX 引擎内置于 Unity 中。默认设置在移动设备上可能代价较高,因此请牢记以下事项

  • 考虑您的目标帧率并相应地设置固定时间步长。默认设置为 0.02 毫秒或 50Hz。对于 30fps 目标,您可以将其提高到 0.03 或更高。
  • 考虑简化网格碰撞器并最小化图层碰撞矩阵以确定特定图层类型的游戏对象之间的交互。

有关 物理设置 和移动游戏优化的信息,请参阅 Unity 的 优化您的移动游戏电子书

性能分析

应用程序开发者通常会忽视性能分析,直到应用程序达到严重故障点。最好将专门的性能分析时间安排到您的流程中,并使用以下最佳实践

  • 在开发过程中确定可以分配性能分析时间的关键点,而不是随机安排。
  • 保存性能分析快照以与 Unity 性能分析器 一起使用。
  • 在目标设备上分析您的游戏,以准确了解游戏在开发的当前阶段的性能。
  • 分析游戏的不同部分。
  • 分析玩家如何玩游戏。(不要仅在游戏处于空闲状态或暂停屏幕时分析游戏。)
  • 在游戏运行一段时间后,以持续模式进行性能分析,以帮助查找在移动设备 过热 时可能遇到的节流问题。

您可以单独或组合使用以下性能分析工具。

  • Unity 性能分析器 Unity 性能分析器是一个完全集成的性能分析工具,可以在 Unity 编辑器中针对您的代码运行,并连接到运行开发模式构建的独立 Android 设备。

  • Android GPU 检查器 使用 Android GPU 检查器 (AGI),您可以执行帧级调试。AGI 还分析系统服务,包括 GPU、CPU、内存、电池和 GPU 计数器。

有关在 Unity 中分析游戏的详细信息,请观看视频 Unity 性能分析简介 或阅读 Unity 的 Unity 游戏性能分析终极指南

内存管理

Android 进程共享目标设备上的可用内存。在目标测试设备拥有充足的可用内存资源时,您应该分析内存使用情况。在游戏中的某个一致点执行内存测试,以便您可以适当地比较会话和内存使用趋势。

在使用 C# 编写的脚本时,请谨慎使用字符串、字符串比较和字符串相关对象的分配(例如游戏设置的 JSON 文件)。这些操作会生成频繁的内存分配,并可能导致碎片化。

对于大型字符串操作序列,请考虑使用 StringBuilder 类,而不是就地连接字符串(例如“this” + “is” + “a” + “bad” + “idea” 与 StringBuilder.Concat() 函数调用)。

有关字符串的更多信息,请参阅 Unity 文档中的 字符串和文本

评估 TextAsset 和 JSON 文本资源与优先的 ScriptableObject 类型。 ScriptableObjects 可以高效地处理跨场景的数据存储,并允许在编辑器到播放时间进行修改。

有关使用替代默认 JSON 处理程序进行移动优化的讨论,请参阅 Hutch 上的文章 网络游戏中隐藏的优化

使用 内存建议 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 顶级工程师的性能分析、内存和代码架构技巧

预制件池

CPU 帧时间峰值几乎完全是由游戏过程中预制件实例化引起的。在进入游戏之前考虑预热弹药、可生成敌人和视觉效果的对象池,以减少或消除启动时 CPU 峰值。您可以在场景加载或引入序列期间将其他优化分散到多个“初始化帧”中。

您可以在 Unity 资源商店 上找到许多与游戏对象池管理相关的第三方池资源。您也可以创建自己的池。请参阅 Unity Learn 上的对象池简介

资源交付

首次部署到 Google Play 时,应用程序的大小存在限制。根据游戏的大小和性质,您可能需要一些或全部游戏资源(角色模型、环境、UI 元素等),以便玩家获得您预期的体验。

您可以使用Play Asset Delivery (PAD) 服务来管理游戏在安装时、快速后续或按需所需的内容。Unity Asset Bundles 已集成以支持 PAD,您可以使用该工具指定要交付的元素。

Addressables

如果您准备并查看 Addressables 命名系统,那么在运行时设置动态资源(例如预制件、纹理和声音文件)将不再是一项复杂的操作。Addressable 资产将您如何安排内容与如何构建和加载内容解耦。Addressables 系统取代了Resources 文件夹和 Asset Bundles,从而简化了您在运行时引用和加载资产的方式。

例如,请参阅 GitHub 上的使用 Addressables 包的演示项目。有关 Addressables 开发的详细信息,请参阅Unity 博客上的 Addressable 资产系统

使用 Addressable 资产布局时,将过少或过多资产捆绑到通用捆绑包中都有利弊。要了解有关使用 Addressables 进行内容管理的更多信息,请参阅使用 Addressables 简化您的内容管理

您可以设置一个独立的演示并尝试访问模式,以便熟悉 Addressables 系统。您还可以查看开源项目适用于 Unity 2019.3 及更高版本的 BuildLayout Explorer,并检查 Addressables 生成的buildlayout.txt 报告。

Unity 开放项目 Chop Chop 的资产使用 Addressables 系统打包了所有加载和卸载操作。请参阅使用 Addressable 资产打包内容 | 开放项目开发日志,了解配置 Addressables 捆绑包的结构和设置的演练。

在 Chop Chop 项目中,默认情况下加载的唯一场景(初始化场景)配置为使用AssetReferences,而不是项目中资产(场景、预制件等)的直接链接。

您可以从 GitHub 获取Unity 开放项目:Chop Chop 的源代码。虽然该项目已不再开发,但 git 存储库和文档仍然可用。

第三方插件

如果您使用第三方插件(例如 Unity Asset Store 中的插件),请确保查看文件夹并从Resources 文件夹中删除不必要的资产。在构建过程中,Unity 会收集Resources 文件夹中包含的所有资产,并将它们打包到一个可以在运行时访问的单个捆绑包中。这可能会增加最终包的大小,并且通常不需要。

要快速找到所有资源文件夹,请在项目面板中搜索Resources。然后,您可以选择每个文件夹以识别其包含的内容以及它是否对您的游戏必要。

图 7. 在从 Unity Asset Store 下载的文件夹中可能潜藏着多个Resources 文件夹。清理这些文件夹以避免将它们打包到您的应用程序捆绑包中。

发布和维护

准备好发布移动游戏后,请决定要向谁发布、如何进行 Alpha 和 Beta 测试以及如何在发布后监控和跟踪性能。

分析有限版本中的反馈

您可以向有限的目标受众发布并执行更大规模的 Beta 测试,或激活您的游戏以在所有市场中全面提供。通过有限发布,您可以根据更广泛的实时受众和设备集合调整应用程序性能。

例如,您可以使用适用于 Unity 的 Android 性能调整器适用于 Unity 的 Google Analytics 来获取有关应用程序性能和玩家趋势的见解,开发团队可以根据这些见解进行调整和推送更新。您还可以使用分析数据来规划续集或类似类型的相关游戏。

Alpha 和 Beta 测试

在您在Google Play Console 中设置应用程序配置文件后,您可以准备公开的 Alpha 和 Beta 测试版本,并将它们分发给有限的受众进行预发布审查。通过向有限的受众发布,您可以解决使用更大范围的设备时遇到的任何最终问题,并收集在全球发布之前可以响应的初始反馈。

您的 Unity 版本通过 Android App Bundles 分发。有关信息,请参阅 Unity 中的手册:交付到 Google Play,其中还介绍了从 APK 文件到 AAB 格式的更改。

监控和跟踪

在游戏的运营和分发阶段,您可以使用Android Vitals 来帮助跟踪您在开发和测试期间可能无法访问的设备上的性能问题。有关详细信息,请观看Reach 和设备以及 Android Vitals 中游戏的新功能

通常,较大的开发团队拥有独特的自定义游戏遥测管道,这些管道提供与设备性能相关的指标。请务必利用Android 性能调整器 (APT) 和相应的 Unity 插件来调整与帧率、图形保真度、加载时间和加载放弃相关的指标。请按照将 Android 性能调整器集成到您的 Unity 游戏中 中的分步指南进行操作。

您的游戏生命周期不会在您上线后停止。监控、维护和响应性能和反馈对于让用户满意、获得正面评价以及最终在所有市场中推广您的游戏至关重要。