kingBook

导航

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:要调整的大小
    该方法可以重复调用多次产生不同效果

注意:

  1. RectTransform 中的除了localPosition和 position 外,其它属性并不会跟随屏幕大小发生变化,
    使用其他属性时需要根据 canvas.localScale 进行计算才能得到实际的大小值。

  2. Canvas下的所有 RectTransform 的 localScale 和 lossyScale 属性,在适应不同大小屏幕时是不会改变的,会变的只有canvas.transform.localScale,canvas.transform.lossyScale 也不会变。

  3. 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}");

posted on 2019-08-15 12:09  kingBook  阅读(203)  评论(0编辑  收藏  举报