Unity中的UGUI坐标问题

时间:2024-04-08 18:59:04

测试代码:

using UnityEngine;

public class TransformTest : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            transform.position = Vector3.zero;
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            transform.localPosition = Vector3.zero;
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.GetComponent<RectTransform>().anchoredPosition = Vector3.zero;
        }
    }
}

测试的初始设定:白色为父物体,蓝色为子物体(注意父物体的锚点和Pivot的设置):
Unity中的UGUI坐标问题

按下A键后结果如下图:
Unity中的UGUI坐标问题
transform.position指的是物体的世界坐标,在UGUI中,世界坐标的原点在屏幕左下角,我把Pivot设置在(0,0)的位置,所以子物体的左下角对准了屏幕的左下角。

按下S键后结果如下图:
Unity中的UGUI坐标问题
localPosition指的是本地坐标,父物体的Pivot在(1,1)的位置,子物体的Pivot在(0,0)的位置,所以子物体的左下角对准了父物体的右上角。
大家再看一下Inspector面板上的坐标,注意到了吗?面板上的坐标并非是(0,0),莫非Unity出错了?面板上的坐标不是本地坐标吗?

从上面的测试可以看出无论是position还是localPosition,都只与Pivot有关,与锚点无关。

按下D键后结果如下图:
Unity中的UGUI坐标问题
我们看一下此时Inspector面板上的坐标,都显示为0!!!
anchoredPosition指的是锚点坐标,从这里可以看出,它和Inspector面板上的坐标是对应的,很多人会把anchoredPosition和localPosition搞混。
子物体的锚点在左上角,所以子物体的左下角,对准了父物体的左上角。

从上面的测试可知:
1、父物体的锚点定位对子物体的位置没有影响,
2、子物体的锚点会影响的是anchoredPosition,而非localPosition
3、Inspector面板上的坐标对应的是anchoredPosition
4、localPosition只受子物体和父物体的Pivot影响