如何防止标签和按钮缩放?

How do you prevent labels and buttons scaling?

我正在测试一个 Godot 应用程序,顶部有一个文本标题,底部有按钮。现在我在中间有一个垫片来保持顶部的标题和底部的按钮。

如果我将“项目设置”->“显示”->“拉伸”设置为禁用,那么我可以设置一个适合我的笔记本电脑的字体和按钮大小,并且标题和按钮的字体大小不会缩小或变大window 已调整。

如何保证and/or测试应用程序导出到iOS和Android时大小合适?是否有某种指南可以帮助为所有设备选择合适的(不可缩放的)按钮尺寸?


Control是如何定位的

在 Godot 中有三种定位 Control 的方法:

  • 放在一个Container。在这种情况下,Container 将控制 child Control 的位置和大小,同时考虑“大小标志”。

    另见 Using Containers, and Containers

  • 通过锚点 (anchor_*) 和边距 (margin_*)。它们确定 Control 的边缘位置。锚点是因子,边距是偏移量。

    例如,Control 的最左边部分将位于 anchor_left * parent_width + margin_left,相对于 parent Control

    当您选择 Control 时,您将在工具栏中出现的“布局”菜单中找到预设。

    另见 Size and anchors

  • 通过 rect_positionrect_size。这些是相对于左上角的 parent Control.

    最终,其他定位 Control 的方法正在改变这些。即使您通过其他方式定位 Control,您也可以更改这些……这不是预期的,但受支持(因为将动画添加到 UI 等)。

不管你用哪个,Godot都会尊重rect_min_size。是的,还有 rect_rotationrect_scale 对上述解释提出了质疑,但它们的工作方式与您预期的一样。

是的,它不是更容易使用的系统。因此,设计器正在针对 Godot 4 进行改进(在撰写本文时目前在 Alpha 3 上)。

回答标题的问题:如果你的拉伸模式设置为disabled,并且你的UI锚定在左上角(是默认值),您将调整 window 的大小,而 UI 不会缩放或适应该更改。 我不认为你不想 UI 适应。


用容器制作顶栏和底栏

您可以使用 VBoxContainer,因为我们将三个条垂直堆叠在一起。是的,第二个是 spacer.

首先,您希望 VBoxContainer 占据整个屏幕。所以将其设置为布局预设“Full Rect”。 所以,是的,我们通过锚点和边距放置 Container

其次,我们希望 spacer 尽可能多地使用 space。为了存档,我们在 spacer 的 size_flags_vertical 上设置了“展开”标志。这就是 Size Flags 的用途。

当然,您在 Container 中放置的内容可能会或可能不会更多 Containers。


制作带有锚点和边距的顶栏和底栏

为顶部栏提供“Top Wide”预设。它将设置边距和锚点,使其保持在顶部,占据全宽,并占据最小高度。

并为底栏设置“底部宽”预设。它将设置边距和锚点,使其保持在底部,占据全宽,并占据最小高度。

你不需要 spacer.

而且,顺便提醒一下,锚点是相对于 parent 的边距。所以你可以嵌套这种方法。是的,不是容器的 Controls 也可以有 children Controls


关于拉伸模式

如您所知,您可以选择:

  • viewport: 所有的尺寸都将以原始分辨率计算,然后将得到的尺寸缩放到设备的分辨率。

  • 2D:还将使用原始分辨率计算所有尺寸,但不是缩放结果尺寸,而是以该尺寸渲染并缩放图像。

  • disabled:它将根据设备的实际分辨率计算所有尺寸。不会发生缩放。

由于 viewport2D,UI 的大小将不会根据设备的实际分辨率计算。这使得我描述的使 UI 适应的方法效率较低(不太有用或不太必要,具体取决于您如何看待它)。因此,如果我们想有效地使用这些方法,我们需要将拉伸模式设置为 disabled.

当然还有纵横比设置

另见 Multiple resolutions and Support multiple form factors and screen sizes


小分辨率设计

您可以在编辑器上测试 UI 如何适应分辨率,方法是调整 window 的大小,或者在项目设置中设置测试宽度和测试高度。 当然,您也可以在实际的智能手机上进行测试。例如,在开发手机游戏时,我经常在 Android 中从 Godot 编辑器启动游戏。

回到拉伸模式,这就是文本发生的情况:

  • disabled:文本保持相同大小。这意味着UI 对于文本来说可能太小了。
  • viewport:文字刻度。这意味着文本可能会变得太小而难以辨认。
  • 2d: 文本也会缩放……除了因为它是图像缩放,它会变得模糊,甚至更难阅读。

如果只考虑文字,没有好的选择。现在,要么为特定的目标分辨率设计UI……要么制作一个可以适应的。对于能够适应的人,我相信 disabled 是最好的拉伸模式,正如我在上面所说的那样。


当然你可以编写脚本

如果你需要在分辨率变化时运行一些代码,你可以连接到根Viewport"size_changed"信号。如果您需要确定设备是横向模式还是纵向模式,您 OS.screen_orientation,如果确实需要,您可以创建自定义 Container.