Unity3d GUI中使用的各种坐标

为什么要变种,有多少种?


我经常碰到这样一个事实,人们根本不了解如何通过某个值来在UI中移动对象,并且对结果常常是不可预测的感到惊讶。 或者说说如何在UI中获取对象的正确坐标。 如果我们通过调试器导出对象的通常位置(位置),那么它将与我们在UI元素的检查器中看到的位置非常不同,那么我们在那里看到的内容以及它如何工作? 结果,到目前为止,已经对来自论坛的100,500个解决方案进行了排序,但其中一个是行不通的。 我想对这样的过程做出有意义的动作。

捕获的本质如下:通常的Transform具有RectTransform的后代,后者负责位置以及与UI元素的大小,比例等有关的许多事情。 多亏了他,我们可以获得以下坐标选项。

  1. 位置
  2. localPosition
  3. anchoredPosition(仍然存在anchoredPosition3D,但我们不会单独考虑它,但我们将假定这是test的一个亚种。anchoredPosition



正常位置


通常的位置根本不适用于单词的UI坐标系。 这些是对象在整个单位环境中的一些常见坐标,并且在世界中有某种表示未连接到接口的对象位置的信息。如果要按对象的宽度移动对象,将无法使用,因为画布具有相对于屏幕的像素坐标。 在全局坐标中,这些不是像素。 因此,物体将在世界范围内移动,例如,以世界尺寸为200个单位而不是200个像素移动,并且会飞向未知的距离。 但是可以明智地使用它。 待会我再告诉你。

锚位置(anchoredPosition)


我们在检查器中看到的是它是什么。



在一个单元中,您可以设置锚点,这是UI元素将相对于其定位的某个点,包括更改父对象的大小/比例时。



在这里,您可以看到我们更改了父对象的大小和比例,我们的对象附着在父对象的中心,并且其坐标没有更改,尽管在屏幕上不再像以前一样。

锚点位置-对象相对于锚点的坐标。 我们将锚定在左上角,并查看坐标已更改。



如果要将对象移动到其宽度,则需要更改anchoredPosition或localPosition。 UI元素的本地位置也以像素为单位计算,但是以不同的方式计算。 因此,如果您需要相对于彼此操纵两个UI元素。 最好使用当地位置。 为什么这样

当地位置(localPosition)


那么什么是当地位置:



当父对象的中心为0时,这是坐标系。右上角是矩形的正宽度,一分为二。 左上角是宽度的一半的负值。 也就是说,如果rect宽度为800像素,则在中间x = 0,在右上方400,在左上方-400。 因此,如果您需要在不考虑锚点的情况下计算坐标,则最好使用局部位置。 只要他们有一个共同的祖先/直肠。 顺便说一句,锚不仅可以用作父对象上的特定点,还可以用作相对于父对象的比例。 在第二种情况下,anchoredPosition将返回localPosition。

为什么我可以对UI元素使用通常的位置? 假设在全局坐标中,如果将第二个坐标分配给一个对象,则无论它们的锚点或本地位置如何,它们都将位于同一点,有时当元素位于不同的画布/不同的面板中且坐标系为本地/锚点时,这会很方便不匹配。

结论/总结


  1. 在检查器中,UI元素显示相对于父级的anchoredPosition或比例。 根据锚的位置考虑AnchoredPosition
  2. localPosition允许您获取相对于父级的常规坐标,而无需绑定到锚点。
  3. position-这是元素在场景空间中的全局位置,与UI无关。


希望有人帮助:-)

Source: https://habr.com/ru/post/zh-CN454246/


All Articles