这有什么技术原因呢?我觉得奇怪的是他们不能都只使用位置。是遗留物吗?
存在三组相关的节点。那些扩展:
\nControl,就在这里您可以找到rect_position。Node2D,就在这里您可以找到position。Spatial,而在这里你只能找到transform。这些节点采用颜色编码。所有Controls 均为绿色,全部Node2D为蓝色,所有Spatials 均为红色。是的,这是关于色觉缺陷的可及性问题。这里有人呼吁重新设计图标:调整编辑器节点图标,使其无需依赖颜色即可区分(色盲友好)。
是的,命名有些混乱。对于初学者 2D 节点,名称中应写“2D”,但 3D 节点则不会(例如Cameravs Camera2D)。Godot 4.0 的情况尤其发生了变化。
如果您对如何更好地命名有想法,您可以提出提案(作为 github 上的问题)。
\n我们来说说这组节点的定位有何不同\xe2\x80\xa6
\n关于变换
\nSpatial节点使用Transform. 事实上,有人提议将transform房产更名为“position”。正如您所知,这不是同一件事,因为 aTransform不仅有位置,还有旋转、缩放等。
我知道你没有问过transform。但是,您需要知道 aNode2D也有一个transform属性,其类型为 - 您已插入 - Transform2D。这就是 aNode2D的实际定位方式。同时position、rotation、rotation_degrees和scale是为了方便使用。
定位控制
\nSpatial并Node2D有transform. 你猜怎么了?Control才不是。相反, aControl旨在以下列方式之一定位:
Container(也是Controls)中,并Container考虑“大小标志”(这就是它们的用途)来决定它的定位方式。anchor_*) 和边距 ( margin_*)。抽象的就是anchor是因素,而margin是偏移的。例如,控件的最左侧部分将位于anchor_left * parent_width + margin_left。rect_position和rect_size。rect_position距离父级左上角的位置在哪里。需要注意的是:rect_min_size坚持。是的,还有rect_rotation和rect_scale,它对上述解释造成了影响,但它的作用正如人们想象的那样。
我说是有意的,因为你可以混合这些。例如,您可以通过锚点和边距来定位控件,或者将其放置在 中Container,然后为rect_positionfor 效果设置动画。
正如您所看到的,position和rect_position是两个不同的东西。并不是某些节点被一个名称或另一个名称或类似的名称卡住了。
我还应该提到这些属性有“全局”版本,因为它们的定位尊重其父级。
\n在前缀上
\n好吧,它们是不同的,但它们的作用——初步近似——是相同的。为什么他们不能有相同的名字?
\n除此之外,它还提醒人们它们不是同一件事。在 Godot 中给属性添加前缀是有原因的。这是为了方便将它们分组到检查器面板中。
\n例如,“Anchor”组将包含名称以 开头的所有属性anchor,并且该前缀不会显示在属性名称上。
同样,您找到的组之一是“矩形”。是的,rect_position在里面。以及相关的属性。这也有助于从代码编辑器中发现这些属性,因为它们会在自动完成中一起显示。
这一切应该让新用户更容易了解Control定位的工作原理。然而,老实说,它的效果并不好。另请参阅提案:重新设计如何向用户呈现用户界面(控件)缩放。
Node2D 内部的控件
\n您可以(而且可能需要)将Controls 放在Node2D. 例如,如果您想要在 a 后面添加aLabel或 a ProgressBar(即) 。ControlNode2D
戈多将处理这个位置。但是您会发现缩放和居中的问题,因为Node2D没有Controls 可以使用的大小(有些 - 例如Sprite- 具有视觉大小作为其 的优点Texture,它不作为属性公开,并且Control不使用它)。
它在那里可能想要用一些混合rect_position和 的代码来破解它position。
将 a 置于Controla 中Node2D本身并不难(有Containers、锚点和边距,以及良好的老手定位)。问题是当它改变大小时保持它居中。特别是当您向 a 添加更多文本时Label,尽管困难重重,它仍然坚持向右增长。但不要担心,您需要的是处理resized信号并进行调用set_anchors_and_margins_preset,这就是您在编辑器中的“布局”选项中所做的事情。
Node2D 内部控件
\n您也可以将 a 放在Node2Da 内Control,Godot 将再次处理该位置。您可能想要设置rect_clip_content在Control.
但是,将 a 放在Node2Da 内Container无法正常工作。无法Container处理Node2D儿童。
如果您想这样做,您很可能需要执行以下操作之一:
\nSprite将(a )更改Node2D为TextureRect(a Control)。TouchScreenButton将(a )更改Node2D为Button(a Control),并在项目设置 -> 输入设备 -> 指向中启用触摸仿真。Viewport你想在那里展示的任何东西。为了便于设计,我建议将其制作为单独的场景。不要忘记指定 的大小。然后,要么:\nCamera2DNode2DViewportViewport内。您可能希望将 的设置为 true。ViewportContainerControlstretchViewportContainerTextureRect和 a ViewportTexture。当我这样做时,我还会建议将主场景的根设为 a Node(不是任何派生类型),然后使用CanvasLayers 将 UI 与游戏世界分开。这将防止Camera2D影响 UI。
| 归档时间: |
|
| 查看次数: |
4848 次 |
| 最近记录: |