RectTransform中localPosition与anchoredPosition的区别

1. Inspector面板中Transform的位置信息显示的是localPosition

2. Inspector面板中RectTransform的位置信息显示的是anchoredPosition3D

  • 2.1 localPosition表示的是子物体的pivot相对于父物体的pivot的坐标
  • 2.2 anchoredPosition3D表示的是子物体的pivot相对于anchor的坐标,当anchor不是一个点时表示前3个元素(left,top,z)
  • 2.3 当子物体的anchor与父物体的pivot坐标重合时anchoredPosition3D与localPosition相等

3. 实例验证(这里为了学习编辑器拓展,采用了编辑器拓展的方式)

  • 3.1 新建两个Image用于测试,相对位置布置如图:
    RectTransform中localPosition与anchoredPosition的区别_第1张图片
    RectTransform中localPosition与anchoredPosition的区别_第2张图片RectTransform中localPosition与anchoredPosition的区别_第3张图片
    RectTransform中localPosition与anchoredPosition的区别_第4张图片
  • 3.2 在Editor目录下新建编辑器拓展脚本
using UnityEditor;
using UnityEngine;
public class CanvasUpdate // 脚本不需要做成组件,所以不需要继承MonoBehaviour
{
    private static Transform m_Tran = GameObject.Find("ImageBlue").transform;
    private static void DebugPos()
    {
        RectTransform rect = m_Tran.GetComponent();
        //Debug.Log(rect.parent.localPosition);
        Debug.Log(rect.localPosition);
        Debug.Log(rect.anchoredPosition3D);
    }
    [MenuItem("CanvasUpdate/Do it! %&z")] // %代表ctrl #代表shift &代表alt
    private static void UpdateCanvas() // 必须是static
    {
        //Canvas.ForceUpdateCanvases(); // 强制刷新所有Canvas的内容
        Debug.Log("UpdateCanvas");
        DebugPos();
    }
}

RectTransform中localPosition与anchoredPosition的区别_第5张图片

  • 3.3 调整父子物体anchor与pivot的位置,然后ctrl+alt+z(不用运行游戏)即可实时打印出localPosition与anchoredPosition3D。以下为按图3.1布置两物体时的打印结果:
    RectTransform中localPosition与anchoredPosition的区别_第6张图片

注意:三维物体在Canvas之外创建,Inspector面板中是Transform,在Canvas下创建则Inspector面板中是RectTransform!

结论:Inspector面板中Transform的坐标显示的是localPosition,RectTransform的坐标显示的是anchoredPosition3D,只是当父物体的pivot与子物体的anchor巧合重合时二者的值相等!(以上例子将Unity坐标轴模式从Center改为Pivot比较容易看出)

你可能感兴趣的:(Unity)