UGUI RectTransform
更多说明
http://www.manew.com/thread-95753-1-1.html
概念:
- 轴心:围绕其旋转的标准化位置,蓝色空心的小圆圈(也就是 pivot 属性)。
- 锚点:编辑器中调整anchorMin,anchorMax的4个三角形角标。
- 锚点参考点:4个三角形角标的中心。
- 矩形:指的是显示内容包围盒的矩形,就是由4个蓝色圆形角点构成的矩形。
属性:
-
anchoredPosition: 此 RectTransform 的
轴心
相对于锚点参考点
的位置。 -
anchoredPosition3D: 此 RectTransform 的
轴心
相对于锚点参考点
的 3D 位置。 -
anchorMin: 父 RectTransform 中左下角锚定到的标准化位置(取值范围:[0,1])。
-
anchorMax: 父 RectTransform 中右上角锚定到的标准化位置(取值范围:[0,1])。
-
offsetMin:
矩形左下角
相对于左下锚点
的偏移。 -
offsetMax:
矩形右上角
相对于右上锚点
的偏移。 -
pivot: 此 RectTransform 中围绕其旋转的标准化位置(取值范围:[0,1])。
-
rect: 本地空间的
矩形
,xy是矩形左下角
相对于轴心
偏移,width 与 height 指矩形
的大小(像素为单位)。 -
sizeDelta: 此 RectTransform 相对于
锚点
之间距离的大小(矩形的大小 - 4个角标所构成的矩形大小,像素为单位)。 -
localPosition:
Canvas RenderMode 为 Overlay/Camera 时, 相对于父 Transform 的位置 -
position:
Canvas RenderMode 为 Overlay 时,轴心
相对于Canvas 的左下角
的偏移
Canvas RenderMode 为 Camera 时, 表示世界坐标 -
SetInsetAndSizeFromParentEdge(RectTransform.Edge edge, float inset, float size);
调整RectTransform的大小
edge:将设置角标到一条边上
inset:距离edge的长
size:要调整的大小
该方法可以重复调用多次产生不同效果
注意:
-
RectTransform 中的除了localPosition和 position 外,其它属性并不会跟随屏幕大小发生变化,
使用其他属性时需要根据 canvas.localScale 进行计算才能得到实际的大小值。 -
Canvas下的所有 RectTransform 的 localScale 和 lossyScale 属性,在适应不同大小屏幕时是不会改变的,会变的只有canvas.transform.localScale,canvas.transform.lossyScale 也不会变。
-
Canvas.RenderMode 为 Screen Space-Overlay 时,rectTransform.position 就是轴心(pivot)的屏幕坐标
应用示例:
- 计算 RectTransform 矩形在屏幕坐标系的大小
Vector2 sizeOnScreen = rectTransform.rect.size * canvas.scaleFactor; // rectTransform 在屏幕坐标系的大小
//Vector2 sizeOnScreen = rectTransform.sizeDelta * canvas.scaleFactor; // 如果 rectTransform.Anchors 的四个角点在同一个点时,也可以使用此行代码
//Canvas RenderMode Overlay
/// <summary>
/// 返回指定RectTransform屏幕坐标矩形
/// </summary>
/// <param name="rectTransform">指定的RectTransform</param>
/// <param name="canvasLocalScale">Canvas的缩放量</param>
/// <returns></returns>
public static Rect getScreenRect(RectTransform rectTransform,Vector3 canvasLocalScale){
Rect rect=rectTransform.rect;
//根据Canvas缩放
rect.width*=canvasLocalScale.x;
rect.height*=canvasLocalScale.y;
rect.position*=canvasLocalScale;
//计算矩形左下角
Vector2 leftBottom=(Vector2)rectTransform.position+rect.position;
rect.position=leftBottom;
return rect;
}
- 计算屏幕坐标在另一个 RectTransform 的本地矩形中的位置
RectTransform current;
RectTransform target;
Vector2 screenPoint = current.position; // Canvas.RenderMode 为 Screen Space-Overlay 时,rectTransform.position 屏幕坐标
RectTransformUtility.ScreenPointToLocalPointInRectangle(target, screenPoint, null, out Vector2 localPoint);
Debug.Log($"target.rect:{target.rect}, localPoint:{localPoint}");