我在使用Unity的UI rectTransform进行编程时发现了一个非常令人困惑的问题:
在检查器中,我们可以发现RectTransform的位置设置为(0,0,0)
但在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)
)
这有什么问题?
答案 0 :(得分:3)
您在RectTransform
组件中看到的不是本地位置。手册说:
定位UI元素
UI元素通常使用其Rect变换定位。如果UI元素是布局组的子元素,它将自动定位,并且可以跳过定位步骤。
当定位Rect变换时,首先确定它是否具有或应该具有任何拉伸行为是有用的。当anchorMin和anchorMax属性不相同时,会发生拉伸行为。
对于非拉伸矩形变换,通过设置anchoredPosition和sizeDelta属性可以最轻松地设置位置。 anchoredPosition指定枢轴相对于锚点的位置。 sizeDelta与没有伸展时的大小相同。
对于拉伸Rect变换,使用offsetMin和offsetMax属性设置位置可能更简单。 offsetMin属性指定rect的左下角相对于左下锚点的角。 offsetMax属性指定rect右上角相对于右上角的角落
来源:https://docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html
在您的情况下,您有一个非拉伸矩形变换。因此,尝试打印锚定位置:
parentObject = transform.parent.gameObject;
Debug.Log("parentObject rectTransform :" + parentObject.GetComponent<RectTransform>().anchoredPosition);