如何解决为什么有些节点使用“position”而其他节点使用“rect_position”?
这是什么技术原因?对我来说,他们不能都只使用位置似乎很奇怪。这是遗留问题吗?
解决方法
有三组相关的节点。那些扩展:
-
Control
,您可以在这里找到rect_position
。 -
Node2D
,您可以在这里找到position
。 -
Spatial
,在这里您只能找到transform
。
这些节点采用颜色编码。所有 Control
均为绿色,所有 Node2D
均为蓝色,所有 Spatial
均为红色。是的,这是关于色觉缺陷的可访问性问题。此处呼吁重新设计图标:Tweak editor node icons to be distinguishable without relying on color (colorblind-friendly)。
是的,命名有些混乱。对于初学者,2D 节点在名称中说“2D”,但 3D 节点则不然(例如 Camera
vs Camera2D
)。这在 Godot 4.0 中尤其发生了变化。
如果您对如何更好地命名有想法,您可以打开提案 (as an issue on github)。
让我们谈谈这些节点集的定位有何不同......
关于变换
Spatial
节点使用 Transform
。事实上,有人提议将 transform
属性重命名为“位置”。正如您所知,这不是一回事,因为 Transform
不仅有位置,还有旋转、缩放等。
我知道你没有问过 transform
。但是,您需要知道 Node2D
还具有 transform
类型的属性 - 您已插入 - Transform2D
。这就是 Node2D
的实际定位方式。同时 position
、rotation
、rotation_degrees
和 scale
是为了便于使用。
定位控制
Spatial
和 Node2D
有 transform
。你猜怎么着? Control
没有。相反,Control
旨在以下列方式之一定位:
- 它被放置在一个
Container
(这也是Control
s)中,Container
决定它的位置,考虑到“大小标志”(这就是它们是为了)。 - 通过锚点 (
anchor_*
) 和边距 (margin_*
)。摘要是锚点是因子,边距是偏移的。例如,控件的最左侧部分将位于anchor_left * parent_width + margin_left
。 - 通过
rect_position
和rect_size
。其中rect_position
是距离父级左上角的位置。
一个警告:rect_min_size
是坚持的。 是的,还有 rect_rotation
和 rect_scale
对上述解释产生了影响,但它的工作原理与人们想象的一样。
我说有意是因为你可以混合这些。例如,您可以通过锚点和边距来定位控件,或者将其放置在 Container
中,然后为 rect_position
设置动画效果。
如您所见,position
和 rect_position
是两个不同的东西。 并非某些节点会被一个名称或另一个名称或类似名称卡住。
我还应该提到这些属性有“全局”版本,因为它们的位置是相对于它们的父级而言的。
在前缀上
好吧,它们是不同的,但它们做 - 大致上 - 相同的事情。为什么他们不能有相同的名字?
除了提醒他们它们不是一回事之外。在 Godot 中为属性添加前缀是有原因的。这是为了便于在检查器面板中对它们进行分组。
例如,“Anchor”组将拥有名称以 anchor
开头的所有属性,并且该前缀不会显示在属性名称中。
同样,您找到的组之一是“Rect”。是的,rect_position
在里面。旁边的相关属性。这也有助于从代码编辑器中发现这些属性,因为它们会在自动完成中一起显示。
这一切都应该让新用户更容易弄清楚 Control
定位是如何工作的。但是,老实说,它的效果并不好。另请参阅提案:Redesign how user interface (Controls) scaling is presented to the user。
Node2D 内部的控件
您可以 - 并且您可能需要 - 将 Control
放在 Node2D
内。例如,如果您想要一个 Label
或一个 ProgressBar
(它们是 Control
)跟在 Node2D
之后。
Godot 会处理这个位置。但是你会发现缩放和居中的问题,因为 Node2D
没有 Control
可以使用的大小(一些 - 例如 Sprite
- 具有视觉大小作为优点他们的 Texture
,未作为属性公开,并且 Control
不使用它)。
可能想用一些混合 rect_position
和 position
的代码来破解它。
在 Control
中居中 Node2D
本身并不难(有 Containers
、锚点和边距,以及好的老手定位)。问题是当它改变大小时保持它居中。特别是当您向 Label
添加更多文本时,它会不顾一切地坚持向右增长。但不要担心,您需要的是处理 resized
信号并调用 set_anchors_and_margins_preset
,这就是您在编辑器中的“布局”选项中所做的。
Node2D 内部控件
您也可以将 Node2D
放在 Control
中,Godot 将再次处理该位置。 您可能希望在 rect_clip_content
上设置 Control
。
但是,将 Node2D
放在 Container
中无法正常工作。 Container
无法处理 Node2D
子项。
如果您正在尝试这样做,您可能需要执行以下操作之一:
- 将
Sprite
(Node2D
)更改为TextureRect
(Control
)。 - 将
TouchScreenButton
(aNode2D
) 更改为Button
(aControl
) 并在项目设置 -> 输入设备 -> 指向中启用触摸仿真。立> - 将
Viewport
与Camera2D
放在一起,无论您想在那里显示什么Node2D
。 为了便于设计,我建议将其作为单独的场景制作。不要忘记为Viewport
指定大小。然后,要么:- 将
Viewport
放在ViewportContainer
(Control
)中。 您可能希望将stretch
的ViewportContainer
设置为 true。 - 或者将
TextureRect
与ViewportTexture
一起使用。
- 将
在此期间,我还建议将主场景的根设为 Node
(不是任何派生类型),然后使用 CanvasLayer
将 UI 与游戏世界。这将防止 Camera2D
影响 UI。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。