为什么有些节点使用“position”而另一些节点使用“rect_position”?

Buc*_*ell 7 gdscript godot

这有什么技术原因呢?我觉得奇怪的是他们不能都只使用位置。是遗留物吗?

The*_*aot 9

存在三组相关的节点。那些扩展:

\n
    \n
  • Control,就在这里您可以找到rect_position
  • \n
  • Node2D,就在这里您可以找到position
  • \n
  • Spatial,而在这里你只能找到transform
  • \n
\n

这些节点采用颜色编码。所有Controls 均为绿色,全部Node2D为蓝色,所有Spatials 均为红色。是的,这是关于色觉缺陷的可及性问题。这里有人呼吁重新设计图标:调整编辑器节点图标,使其无需依赖颜色即可区分(色盲友好)

\n

是的,命名有些混乱。对于初学者 2D 节点,名称中应写“2D”,但 3D 节点则不会(例如Cameravs Camera2D)。Godot 4.0 的情况尤其发生了变化。

\n

如果您对如何更好地命名有想法,您可以提出提案(作为 github 上的问题)。

\n

我们来说说这组节点的定位有何不同\xe2\x80\xa6

\n
\n

关于变换

\n

Spatial节点使用Transform. 事实上,有人提议将transform房产更名为“position”。正如您所知,这不是同一件事,因为 aTransform不仅有位置,还有旋转、缩放等。

\n

我知道你没有问过transform。但是,您需要知道 aNode2D也有一个transform属性,其类型为 - 您已插入 - Transform2D。这就是 aNode2D的实际定位方式。同时positionrotationrotation_degreesscale是为了方便使用。

\n
\n

定位控制

\n

SpatialNode2Dtransform. 你猜怎么了?Control才不是。相反, aControl旨在以下列方式之一定位:

\n
    \n
  • 它被放置在 a Container(也是Controls)中,并Container考虑“大小标志”(这就是它们的用途)来决定它的定位方式。
  • \n
  • 通过锚点 ( anchor_*) 和边距 ( margin_*)。抽象的就是anchor是因素,而margin是偏移的。例如,控件的最左侧部分将位于anchor_left * parent_width + margin_left
  • \n
  • rect_positionrect_sizerect_position距离父级左上角的位置在哪里。
  • \n
\n

需要注意的是:rect_min_size坚持。是的,还有rect_rotationrect_scale,它对上述解释造成了影响,但它的作用正如人们想象的那样。

\n

我说是有意的,因为你可以混合这些。例如,您可以通过锚点和边距来定位控件,或者将其放置在 中Container,然后为rect_positionfor 效果设置动画。

\n
\n

正如您所看到的,positionrect_position是两个不同的东西。并不是某些节点被一个名称或另一个名称或类似的名称卡住了。

\n

我还应该提到这些属性有“全局”版本,因为它们的定位尊重其父级。

\n
\n

在前缀上

\n

好吧,它们是不同的,但它们的作用——初步近似——是相同的。为什么他们不能有相同的名字?

\n

除此之外,它还提醒人们它们不是同一件事。在 Godot 中给属性添加前缀是有原因的。这是为了方便将它们分组到检查器面板中。

\n

例如,“Anchor”组将包含名称以 开头的所有属性anchor,并且该前缀不会显示在属性名称上。

\n

同样,您找到的组之一是“矩形”。是的,rect_position在里面。以及相关的属性。这也有助于从代码编辑器中发现这些属性,因为它们会在自动完成中一起显示。

\n

这一切应该让新用户更容易了解Control定位的工作原理。然而,老实说,它的效果并不好。另请参阅提案:重新设计如何向用户呈现用户界面(控件)缩放

\n
\n

Node2D 内部的控件

\n

您可以(而且可能需要)将Controls 放在Node2D. 例如,如果您想要在 a 后面添加aLabel或 a ProgressBar(即) 。ControlNode2D

\n

戈多将处理这个位置。但是您会发现缩放和居中的问题,因为Node2D没有Controls 可以使用的大小(有些 - 例如Sprite- 具有视觉大小作为其 的优点Texture,它不作为属性公开,并且Control不使用它)。

\n

它在那里可能想要用一些混合rect_position和 的代码来破解它position

\n

将 a 置于Controla 中Node2D本身并不难(有Containers、锚点和边距,以及良好的老手定位)。问题是当它改变大小时保持它居中。特别是当您向 a 添加更多文本时Label,尽管困难重重,它仍然坚持向右增长。但不要担心,您需要的是处理resized信号并进行调用set_anchors_and_margins_preset,这就是您在编辑器中的“布局”选项中所做的事情。

\n
\n

Node2D 内部控件

\n

您也可以将 a 放在Node2Da 内Control,Godot 将再次处理该位置。您可能想要设置rect_clip_contentControl.

\n

但是,将 a 放在Node2Da 内Container无法正常工作。无法Container处理Node2D儿童。

\n

如果您想这样做,您很可能需要执行以下操作之一:

\n
    \n
  • Sprite将(a )更改Node2DTextureRect(a Control)。
  • \n
  • TouchScreenButton将(a )更改Node2DButton(a Control),并在项目设置 -> 输入设备 -> 指向中启用触摸仿真。
  • \n
  • 旁边有一个Viewport你想在那里展示的任何东西。为了便于设计,我建议将其制作为单独的场景。不要忘记指定 的大小。然后,要么:\nCamera2DNode2DViewport
      \n
    • 将其放在(a )Viewport内。您可能希望将 的设置为 trueViewportContainerControlstretchViewportContainer
    • \n
    • 或者使用 aTextureRect和 a ViewportTexture
    • \n
    \n
  • \n
\n
\n

当我这样做时,我还会建议将主场景的根设为 a Node(不是任何派生类型),然后使用CanvasLayers 将 UI 与游戏世界分开。这将防止Camera2D影响 UI。

\n