赞
踩
1.RectTransform参数详解:
Anchors(锚点)
说明:
锚点仅参考父物体,以父物体左下角为(0,0),右上角为(1,1)建立XY平面坐标系,Min表示左下三角形顶点坐标值,Max表示右上三角形顶点坐标值,当前状态重合且位于父物体左下角,所以值都为(0,0)。
Pivot(中心点)
说明:
中心点仅参考自身,以自身左下角为(0,0),右上角为(1,1)建立XY平面坐标系,Pivot值为蓝色小圆圈在该坐标系内位置的值,(0.5,0.5)表示中心点处于自身中间的情况。
2.锚点四种情况详解:
①当任意两个锚点不重合时,面板上会显示Left,Top,Right,Bottom,分别对应自身左上右下边界距离锚点围成矩形左上右下边界的距离。当这四个值都为零时,锚点边界与自身边界重合。
②当锚点X值相等时,Left和Right会变成PosX和Width
此时可以通过rectTransform.anchoredPosition设置PosX的值实现横向平移效果,如字幕滚动效果:
rectTransform.anchoredPosition += Vector2.right * Time.deltaTime;
也可以通过rectTransform.sizeDelta设置自身宽度:
rectTransform.sizeDelta = new Vector2(300, 0);
③当锚点Y值相等时,Top和Bottom会变成PosY和Height
此时可以通过rectTransform.anchoredPosition设置PosY的值实现纵向平移效果:
rectTransform.anchoredPosition += Vector2.up * Time.deltaTime;
也可以通过rectTransform.sizeDelta设置自身高度:
rectTransform.sizeDelta = new Vector2(0, 300);
④当锚点X,Y值都相等,即两点重合时,显示为上述②和③合并的情况:
此时可以通过rectTransform.sizeDelta设置宽高,
也可以通过rectTransform.anchoredPosition设置横纵向的位移。
补充:
anchoredPosition:自身中心点相对锚点的位置偏移,即上面出现的PosX和PosY。
忽略锚点和中心点获取自身宽高:
rectTransform.rect.width
rectTransform.rect.height
3.代码实现上述第一种锚点情况
①图标显示为:
②代码设置:
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);
解释:
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(中心点)的值。
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时会有效果,如下图所示:
补充举例:视频播放器的全屏和还原
1.设置播放器父物体为全屏
2.拖好播放器框体锚点(这里不用完全对齐,不影响控制结果)
对齐后播放器框体锚点如下图:
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.总结:
通过 anchorMin、anchorMax 属性就可以确定一个矩形范围,再通过offsetMin、offsetMax 改变框体相对该范围的偏移就能实现对大小位置的控制。
关于 rectTransform.rect.width / height 获取不到值的情况:
当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}");
- }
当前操作适合部分情况。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。