支持多种外形规格和屏幕尺寸

本主题介绍了在使用 Godot 进行 Android 游戏开发时如何支持多种外形规格和屏幕尺寸。

Android 设备有多种外形规格和屏幕尺寸。常见类别包括

  • 手机
  • 平板电脑
  • 电视和电视机顶盒
  • 搭载 Android Runtime for Chrome 的笔记本电脑

这种多样性意味着您的游戏将遇到各种不同的屏幕分辨率。这些屏幕分辨率通常具有不同的宽高比。例如

  • 横向的 19:9 宽高比手机 (2280x1080)
  • 横向的 20:9 宽高比手机 (3200x1400)
  • 1080p 高清电视,宽高比为 16:9 (1920x1080)
  • 宽高比为 4:3 的平板电脑 (2048x1536)

您的游戏设计应考虑这些差异,以确保无论屏幕分辨率、设备宽高比和用户输入方法如何,都能正确显示。

显示分辨率

Godot 使用像素定义屏幕分辨率和大小。我们建议您为 Godot 项目设置标准的基础分辨率。Godot 提供了设置,用于控制当显示分辨率与项目的基础分辨率不同时的行为。

设置基础分辨率

要为项目设置基础分辨率,请在 Godot 编辑器中打开项目后执行以下步骤

  1. 从 Godot 菜单栏中选择 **“项目”->“项目设置…”**。
  2. 在 **“项目设置”** 窗口中,在 **“类别”** 标签页中找到 **“显示”** 列表,然后选择 **“窗口”** 项。
  3. 在 **“尺寸”** 类别下,将 **“宽度”** 和 **“高度”** 字段设置为所需的像素测量基础分辨率。
Godot width and height project settings
图 1. **“项目设置”** 中的 **“宽度”** 和 **“高度”** 字段

当 Godot 编辑器设置为 2D 视图时,它会显示一个与基础分辨率对应的引导矩形。当从编辑器运行项目或场景时,基础分辨率用作项目窗口的默认尺寸。

The base resolution rectangle in the Godot editor 2D view
图 2. Godot 编辑器 2D 视图中的基础分辨率矩形,基础分辨率设置为 640x360 像素

拉伸设置

有两个设置控制当基础分辨率与显示分辨率不同时如何调整基础分辨率:**“拉伸模式”** 和 **“拉伸宽高比”**。这些设置位于 **“项目设置”** 窗口的 **“显示”->“窗口”** 部分。

Godot stretch project settings
图 3. **“项目设置”** 中的 **“拉伸模式”** 和 **“拉伸宽高比”** 字段

**“拉伸模式”** 有三个设置:disabled2dviewport。下一部分包含不同 **“拉伸宽高比”** 和 **“拉伸模式”** 设置的视觉示例。所有示例都使用 320x180 像素的项目基础分辨率。

`disabled` 设置不调整或更改基础分辨率。如果 **“拉伸模式”** 设置为 disabled,则 **“拉伸宽高比”** 的值始终会被忽略。

Stretch mode disabled with display resolution of 320x180
图 4. 拉伸模式 disabled,显示分辨率为 320x180

如果显示分辨率小于基础分辨率,则底部和/或右侧边缘将被裁剪。

Stretch mode disabled with display resolution of 256x128
图 5. 拉伸模式 disabled,显示分辨率为 256x128

如果显示分辨率大于基础分辨率,则多余区域留空。

Stretch mode disabled with display resolution of 512x256
图 6. 拉伸模式 disabled,显示分辨率为 512x256

`2d` 设置会将基础分辨率缩放到显示分辨率。对于使用 2D 美术的项目,这会导致由于基础分辨率和显示分辨率之间不再存在 1:1 像素比而产生的缩放伪影。此设置可能适用于不需要像素级完美渲染的项目中的某些高分辨率美术风格。

**“拉伸宽高比”** 设置指定了应用于缩放的约束,以保持基础分辨率的宽高比。**“拉伸宽高比”** 设置选项在“宽高比”部分进行描述。下面是使用 **“拉伸宽高比”** 为 ignore2d **“拉伸模式”** 设置的示例,它将缩放到显示分辨率而不受任何约束

Stretch mode 2d with display resolution of 256x128
图 7. 拉伸模式 2d,显示分辨率为 256x128
Stretch mode 2d with display resolution of 512x256
图 8. 拉伸模式 2d,显示分辨率为 512x256

`viewport` 设置将根场景的 Viewport 设置为基础分辨率。根 Viewport 的渲染输出随后会缩放到显示分辨率。Godot Viewport 对象用于创建屏幕视图,或在另一个 Viewport 内创建子视图。与 2d 设置不同,viewport 设置在缩放到显示分辨率时不会应用过滤。`viewport` 设置还使用 **“拉伸宽高比”** 的值来确定是否应用约束以保留宽高比。当需要像素级完美精度时,viewport 设置比 2d 设置是更好的选择,因为主要渲染仍然在基础分辨率下进行。下面是使用 **“拉伸宽高比”** 为 ignoreviewport **“拉伸模式”** 设置的示例

Stretch mode viewport with display resolution of 256x128
图 9. 拉伸模式 viewport,显示分辨率为 256x128
Stretch mode viewport with display resolution of 512x256
图 10. 拉伸模式 viewport,显示分辨率为 512x256

宽高比

**“拉伸宽高比”** 有几个宽高比缩放约束选项。如果 **“拉伸宽高比”** 设置为 ignore,则不应用任何约束。当 **“拉伸宽高比”** 设置为 keep 时,基础分辨率将缩放到适合显示分辨率的最大尺寸,同时保持原始宽高比。显示屏中未被缩放图像覆盖的区域将填充黑色条。根据宽高比差异的主导维度,这些条将是水平条(称为信箱)或垂直条(称为柱状)。

Stretch mode viewport, stretch aspect keep, with display resolution of 384x256
图 11. 拉伸模式 viewport拉伸宽高比 keep,显示分辨率为 384x256
Stretch mode viewport, stretch aspect keep, with display resolution of 512x200
图 12. 拉伸模式 viewport拉伸宽高比 keep,显示分辨率为 512x200

**“拉伸宽高比”** 包含 keep 设置的两个变体:keep_widthkeep_height。当设置为 keep_width 时,如果显示分辨率的宽高比宽于基础分辨率,则会添加柱状黑边。但是,如果显示分辨率的宽高比高于基础分辨率,则多余区域留空。空白区域会填充屏幕底部。

Stretch mode viewport, stretch aspect keep_width, with display resolution of 512x384
图 13. 拉伸模式 viewport拉伸宽高比 keep_width,显示分辨率为 512x384

`keep_height` 设置在水平方向而不是垂直方向起作用。空白区域会填充屏幕右侧。

Stretch mode viewport, stretch aspect keep_height, with display resolution of 512x200
图 14. 拉伸模式 viewport拉伸宽高比 keep_height,显示分辨率为 512x200

最终的 **“拉伸宽高比”** 设置是 expand。`expand` 设置保持基础分辨率宽高比,但会将多余区域留空,而不是添加信箱或柱状黑边。

Stretch mode viewport, stretch aspect expand, with display resolution of 384x256
图 15. 拉伸模式 viewport拉伸宽高比 expand,显示分辨率为 384x256
Stretch mode viewport, stretch aspect expand, with display resolution of 512x256
图 16. 拉伸模式 viewport拉伸宽高比 expand,显示分辨率为 512x256

锚点

在支持多种屏幕分辨率时,UI 元素定位需要额外的考虑。例如,使用绝对像素坐标将控件放置在右上角会导致在具有不同水平分辨率的设备上定位不一致。Godot 的 UI 系统支持使用 AnchorMargin 属性进行相对定位。UI 元素的 Anchor 属性指定其父控件对象或视口上的锚点。然后,Margin 属性的值用于相对于其锚点偏移控件。

对象必须派生自 Godot Control 对象,才能包含 AnchorMargin 属性。Godot 的标准 UI 元素都派生自 Control。当在 Godot 编辑器中选择派生自 Control 的对象时,**“检查器”** 标签页中会显示 Anchor 和 Margin 的属性字段。

A button control selected with anchor and margin properties visible in the inspector
图 17. 选中的 Button 控件,其 **“锚点”** 和 **“边距”** 属性在检查器中可见

Godot 有一个 **“布局”** 工具,可以快速将 AnchorMarginSize 属性设置为常用预设值。当在编辑器中选择派生自 Control 的对象时,场景视图上方的工具栏中会提供 **“布局”** 下拉菜单。**“布局”** 工具预设包括定位和定位与大小的组合。定位预设支持的用例包括:居中、锚定到右上角、锚定到左中。定位加大小预设包括锚定到底部同时跨越整个父宽度等用例。

Godot editor layout drop-down menu
图 18. Godot 编辑器 **“布局”** 下拉菜单

锚点适用于平视显示器、屏幕提示或基本对话框等常见用例。Godot 的 容器 系统旨在用于更复杂的 UI 布局,例如显示包含大量控件的窗口或对话框,或动态调整内容大小。

视场

Godot 具有视场设置,用于控制 3D 场景在不同宽高比下的呈现。视场调整由 Camera 对象的 Keep Aspect 属性控制。Keep Height 的默认值适用于横向运行的项目。当基础分辨率和显示分辨率的宽高比不同时,Keep Height 会调整为更宽或更窄的视场。Keep Width 设置对于纵向运行的项目是更好的选择。Keep Width 会根据宽高比差异调整为更高或更短的视场。

视口控制

Viewport 对象提供对宽高比和缩放的精细控制。项目可以使用 Viewport 执行以下操作,例如

  • 以其基础分辨率宽高比渲染场景,并带有与分辨率无关的边框。
  • 以较低分辨率渲染 3D 场景以提高性能,并将其放大到原生分辨率显示。
  • 为 VR 应用渲染场景的左右眼视图。
  • 生成动态纹理。

有关演示如何使用 Viewport 对象的示例,请参阅 Godot Viewport 示例。

用户输入

某些游戏设计与 Android 支持的所有输入模式不兼容。支持多点触控手势的游戏通常在添加对鼠标和游戏手柄输入的支持时遇到问题。围绕游戏手柄输入设计的游戏可能难以实现有效的触摸控制。Godot 支持所有这些输入形式,但您应该在开发早期决定您打算在项目中使用的输入方法并进行相应的设计。

对于触摸和鼠标输入可互换的项目,Godot 包含代理选项,可以从鼠标事件生成模拟触摸事件,反之亦然。这些选项消除了为鼠标和触摸事件编写单独输入处理代码的需要。可用选项是:**“从鼠标模拟触摸”** 和 **“从触摸模拟鼠标”**。这两个选项都位于 **“项目设置”** 的 **“输入设备”->“指向”** 部分。

Godot project settings for input devices
图 19. **“项目设置”** 中的 **“输入设备”->“指向”** 设置

其他资源