Unity UI中RectTransform的位置

9

我在使用Unity的UI rectTransform编程时发现了一个非常令人困惑的问题:

在检查器中,我们可以发现RectTransform的位置被设置为(0,0,0) enter image description here

但是在Start()函数中的代码中,当我打印位置时:

parentObject = transform.parent.gameObject;
Debug.Log("parentObject rectTransform :" + parentObject.GetComponent<RectTransform>().localPosition);

这将给我一个位置:
parentObject rectTransform :Panel: (0.0, -562.5, 0.0)
UnityEngine.Debug:Log(Object)
NewWorkerController:Start() (at Assets/Scripts/NewWorkerController.cs:60)

当我们尝试获取position而不是localPosition时,事情会变得更加混乱:

parentObject rectTransform :Panel: (621.0, 1365.5, 0.0)
UnityEngine.Debug:Log(Object)
NewWorkerController:Start() (at Assets/Scripts/NewWorkerController.cs:60)

我在playMode模式下检查了该rectTransform的posX和posY,发现它们没有被改变(一直显示为(0,0,0))。

出了什么问题?


脚本在哪个 GameObject 上? - Smartis
@Smartis脚本已附加到层次结构中Panel的子节点newWorkPlace上。 - armnotstrong
请使用.GetComponent<RectTransform>().position而不是.GetComponent<RectTransform>().localPosition - Smartis
@Smartis 使用 position 将会得到一个更奇怪的结果。 - armnotstrong
2个回答

6
你在RectTransform组件中看到的不是本地位置。手册中写道:
定位UI元素 通常使用其Rect Transform来定位UI元素。如果UI元素是布局组的子对象,则会自动定位并可以跳过定位步骤。
在定位Rect Transform时,首先确定它是否具有或应该具有任何拉伸行为是很有用的。当anchorMin和anchorMax属性不相同时会发生拉伸行为。
对于非拉伸性的Rect Transform,最容易设置位置的方法是设置anchoredPosition和sizeDelta属性。anchoredPosition指定枢轴相对于锚点的位置。sizeDelta在没有拉伸时就是大小。
对于拉伸Rect Transform,使用offsetMin和offsetMax属性设置位置可能更简单。offsetMin属性指定矩形左下角相对于左下锚点的位置,offsetMax属性指定矩形右上角相对于右上锚点的位置。
来源:https://docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html 在你的情况下,你有一个非拉伸的Rect Transform。因此,请尝试打印出anchored position:
parentObject = transform.parent.gameObject;
Debug.Log("parentObject rectTransform :" + parentObject.GetComponent<RectTransform>().anchoredPosition);

2

有一种方法可以减少困惑,更好地理解改变RectTransform如何影响脚本中所见的值(例如,在场景/检查器设置中进行更改如何反映在脚本成员变量中)。

  1. 创建单独的检查器属性窗口:单击RectTransform中的三个点并选择“属性...”
  2. 打开调试模式:在应该弹出的新窗口中... 单击整个窗口的最高级别的三个点并选择“调试”。 现在,您可以玩弄具有RectTransform的对象,并查看调试窗口中的成员变量(这些变量与脚本中可访问的相同变量)显示您的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接