1.RectTransform参数详解:

Anchors(锚点)

unity延顶点方向偏移 unity调整锚点_unity3d

unity延顶点方向偏移 unity调整锚点_宽高_02

说明:

    锚点仅参考父物体,以父物体左下角为(0,0),右上角为(1,1)建立XY平面坐标系,Min表示左下三角形顶点坐标值,Max表示右上三角形顶点坐标值,当前状态重合且位于父物体左下角,所以值都为(0,0)。

Pivot(中心点)

unity延顶点方向偏移 unity调整锚点_unity3d_03

unity延顶点方向偏移 unity调整锚点_宽高_04

说明:

    中心点仅参考自身,以自身左下角为(0,0),右上角为(1,1)建立XY平面坐标系,Pivot值为蓝色小圆圈在该坐标系内位置的值,(0.5,0.5)表示中心点处于自身中间的情况。

2.锚点四种情况详解:

①当任意两个锚点不重合时,面板上会显示Left,Top,Right,Bottom,分别对应自身左上右下边界距离锚点围成矩形左上右下边界的距离。当这四个值都为零时,锚点边界与自身边界重合。

unity延顶点方向偏移 unity调整锚点_宽高_05

②当锚点X值相等时,Left和Right会变成PosX和Width

unity延顶点方向偏移 unity调整锚点_宽高_06

此时可以通过rectTransform.anchoredPosition设置PosX的值实现横向平移效果,如字幕滚动效果:

    rectTransform.anchoredPosition += Vector2.right * Time.deltaTime;

也可以通过rectTransform.sizeDelta设置自身宽度:

    rectTransform.sizeDelta = new Vector2(300, 0);

③当锚点Y值相等时,Top和Bottom会变成PosY和Height

unity延顶点方向偏移 unity调整锚点_unity延顶点方向偏移_07

此时可以通过rectTransform.anchoredPosition设置PosY的值实现纵向平移效果:

    rectTransform.anchoredPosition += Vector2.up * Time.deltaTime;

也可以通过rectTransform.sizeDelta设置自身高度:

    rectTransform.sizeDelta = new Vector2(0, 300);

④当锚点X,Y值都相等,即两点重合时,显示为上述②和③合并的情况:

unity延顶点方向偏移 unity调整锚点_unity3d_08

此时可以通过rectTransform.sizeDelta设置宽高,

也可以通过rectTransform.anchoredPosition设置横纵向的位移。

补充:

anchoredPosition:自身中心点相对锚点的位置偏移,即上面出现的PosX和PosY。

忽略锚点和中心点获取自身宽高:

    rectTransform.rect.width

    rectTransform.rect.height

3.代码实现上述第一种锚点情况

①图标显示为:

unity延顶点方向偏移 unity调整锚点_宽高_09

②代码设置:

rectTransform = GetComponent<RectTransform>();

rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, 0);

rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 0);

rectTransform.anchorMax = new Vector2(1, 1);

rectTransform.anchorMin = new Vector2(0, 0);

rectTransform.pivot = new Vector2(0.5f, 0.5f);

rectTransform.localScale = new Vector3(1, 1, 1);

rectTransform.localPosition = new Vector3(0, 0, 0);

rectTransform.localEulerAngles = new Vector3(0, 0, 0);

解释:

unity延顶点方向偏移 unity调整锚点_unity延顶点方向偏移_10

rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, 0);

说明:SetInsetAndSizeFromParentEdge用于设置Left、Top、Right、Bottom值,

    第一个参数为Edge枚举,用于指定上下左右方向;

    第二个参数为指定方向的值,比如当前设置Top为0;

    第三个参数为对立方向的负值,比如当前等同于设置Bottom = -0,如果是10的话,则   Bottom显示为-10

    所以当前函数能同时设置两个值。

    (由于调用当前函数会对Anchors造成影响,所以设置Anchors应放在后面。)

rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 0);

说明:理解同上

rectTransform.anchorMax = new Vector2(1, 1);

rectTransform.anchorMin = new Vector2(0, 0);

说明:设置Anchors(锚点)的Max和Min值,对应上图即可。

rectTransform.pivot = new Vector2(0.5f, 0.5f);

说明:设置Pivot(中心点)的值。

unity延顶点方向偏移 unity调整锚点_ugui_11

rectTransform.localScale = new Vector3(1, 1, 1);

rectTransform.localEulerAngles = new Vector3(0, 0, 0);

说明:设置Rotation和Scale的值。

rectTransform.localPosition = new Vector3(0, 0, 0);

说明:当前设置X = 0,Y = 0,Z = 0

    X值对应Left和Right,Left = X,Right = -X

    Y值对应Top和Bottom,Top = Y,Bottom = -Y

    Z值对应PosZ,如上图标记处。PosZ描述RectTransform在Z轴上的偏移,仅在3D空间即Canvas组件的RenderMode参数设置为WorldSpace时会有效果,如下图所示:

unity延顶点方向偏移 unity调整锚点_锚点_12

补充举例:视频播放器的全屏和还原

1.设置播放器父物体为全屏

unity延顶点方向偏移 unity调整锚点_宽高_13

 2.拖好播放器框体锚点(这里不用完全对齐,不影响控制结果)

unity延顶点方向偏移 unity调整锚点_锚点_14

对齐后播放器框体锚点如下图:

unity延顶点方向偏移 unity调整锚点_宽高_15

3.上代码

//挂在播放器框体上
public class VideoPlayerPanel : MonoBehaviour
{
    //播放器框体
    private RectTransform rectTrans = null;
    //左下锚点初始值
    private Vector2 minAnchorValue_init;
    //右上锚点初始值
    private Vector2 maxAnchorValue_init;
    
    private void Awake()
    {
        rectTrans = transform.GetComponent<RectTransform>();

        //Rect属性初始化
        minAnchorValue_init = rectTrans.anchorMin;
        maxAnchorValue_init = rectTrans.anchorMax;
    }

    /// <summary>
    /// 设置是否全屏
    /// </summary>
    public void SetFullScreenOrNot(bool isFull)
    {
        //1.改变锚点位置
        if (isFull)
        {
            rectTrans.anchorMin = Vector3.zero;
            rectTrans.anchorMax = Vector3.one;
        }
        else
        {
            rectTrans.anchorMin = minAnchorValue_init;
            rectTrans.anchorMax = maxAnchorValue_init;
        }
        
        //2.设置框体相对锚点的偏移为0
        rectTrans.offsetMin = Vector2.zero;
        rectTrans.offsetMax = Vector2.zero;

        //3.重置缩放旋转(这步可有可无)
        rectTrans.localScale = Vector3.one;
        rectTrans.localEulerAngles = Vector3.zero;
    }
}

4.总结:

        通过 anchorMinanchorMax 属性就可以确定一个矩形范围,再通过offsetMinoffsetMax 改变框体相对该范围的偏移就能实现对大小位置的控制。

关于 rectTransform.rect.width / height 获取不到值的情况:

unity延顶点方向偏移 unity调整锚点_宽高_16

当Canvas出现【Some values driven by Canvas】,rect属性值获取可能延时,可在协程中等待:

private void Start()
    {
        uiObj_rectTransform = uiObj.GetComponent<RectTransform>();
        StartCoroutine(GetRectSize());
    }

    IEnumerator GetRectSize()
    {
        float obj_width = uiObj_rectTransform.rect.size.x;
        float obj_height = uiObj_rectTransform.rect.size.y;

        //Canvas出现[Some Values Driven By Canvas]提示时UI物体不能及时获取到宽高,需等待
        yield return obj_width != 0 && obj_width != 0;

        Debug.Log($"宽 = {obj_width}  高 = {obj_height}");
    }

 当前操作适合部分情况。