【问题标题】:How to force Godot to recalculate control nodes size/position?如何强制 Godot 重新计算控制节点的大小/位置?
【发布时间】:2022-03-07 18:29:33
【问题描述】:

在 Godot 3.2.1 中构建 UI。当然,我使用锚点,因此 UI 元素会根据指定的布局自动排列在屏幕内。我有 UI 缩放系统 - 没什么特别的 - 只需更改字体大小 (DynamicFont.size)。如果字体足够大,那么一些 UI 节点可能会被挤出屏幕。但是,节点不会随着字体大小的减小而恢复到正常大小/位置。解决混乱的方法是调整游戏窗口的大小,这并不总是一种选择,而且似乎也不是处理问题的正确方法。那么如何强制 Godot 重新计算控制节点的大小/位置呢?

【问题讨论】:

  • 对于 UI 缩放,考虑使用2d 拉伸模式和expand 拉伸方面让 Godot 自动处理。有关详细信息,请参阅文档中的 Multiple resolutions
  • @Calinou 这实际上是我的情况。我使用 2D + 扩展。提到的附加缩放的目的是相对于其他部分(图标、图像、精灵)缩放 UI。因为文本可能会变得太大或太小,具体取决于屏幕尺寸/分辨率、与屏幕的距离等。所以这只是为了方便而进行的另一个级别的调整。不幸的是,Godot 文档只解释了最简单的东西。
  • 这个拉取请求在合并后应该可以解决这个需求:github.com/godotengine/godot/pull/21446 不幸的是,将它合并到 3.2.2 中为时已晚。

标签: godot


【解决方案1】:

在更改字体大小后将父控件的最小大小更改为Vector2(0, 0) 可能会奏效:

$Control.rect_min_size = Vector2(0, 0)

如果它已经设置为Vector2(0, 0),您可能需要使用call_deferred() 对其进行两次更改才能使其正常工作。

【讨论】:

  • 感谢您的建议。在这项技术上取得了一些进展。但是,我的 UI 非常复杂,分布在许多场景中。所以我最终循环了所有场景的所有控制节点。对于我做的每个节点rect_min_size = Vector2(10000, 10000) 然后rect_min_size = Vector2(0, 0)。不知道call_deferred 是什么。有点工作。但!这太荒谬了。而且有点迟钝。我也必须从尾部移动到头部(根)。
  • 也许有机会以某种方式发出关于调整窗口大小的信号,以便 Godot 可以根据容器布局自动完成?
  • 这可以通过连接根视口的size_changed 信号来完成,如下所示:github.com/godotengine/godot-demo-projects/blob/…(仅在使用disabled2d 拉伸模式时有效。)
  • 感谢您的链接。也许我不明白。我不想处理信号。我想发出信号,以便 Godot 可以处理它。我认为它是一个虚拟窗口调整大小 - Godot 有更新容器大小/位置的代码,所以我想执行代码。听起来很简单。在实践中是不可能的。
  • 每个基于 Control 的节点都有 resizedminimum_size_changed 信号。
【解决方案2】:

在您的场景树中,找到包含您要重新计算的所有元素的顶级容器。在计算机科学术语中,这将是场景树中最低的共同祖先。现在,通过将容器的“可见”属性设置为 false 来隐藏容器。然后,添加一个延迟调用,将其“可见”属性改回 true。

var your_container = $".".find_node("your-container")
your_container.visible = false
your_container.call_deferred("set_visible", true)

这似乎导致 Godot 重新计算 'your_container' 的布局。

看起来只有 CanvasItem 派生类具有“可见”属性,因此您不能简单地在 CanvasLayer 上设置“可见”属性。

幸运的是,Containers 和 Controls 都派生自 CanvasItem,因此如果您的最低共同祖先节点是 Container 或 Control 或其他 CanvasItem 派生类实例,则此方法应该可以正常工作。

【讨论】:

    【解决方案3】:

    我通过从父元素发出信号来完成这项工作,这似乎会强制刷新:

    canvas_item.emit_signal("item_rect_changed")
    

    问题子被刷新,与可见性方法不同的是,焦点被保留了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多