RectTransform接口详解

RectTransform 接口详解
继承:Component->Transform->RectTranfrom
using UnityEngiee
描述:RectTransform封装一个矩形的位置,锚点、中心点和尺寸的信息;(它实际上是GUI物体对Transform组件的细致化)
需要用到RectTransform组件的物体,在添加了(Rawimage,Image,Text,Mask,)等组件会自动添加
RectTransform虽然继承自Transform,同样作为GameObject的组件,但是:
RectTransform组件和GameObject.Tranform一样,直接通过游戏物体访问,实际上,含有RectTransform组件的物体,它的Transform组件已经被RectTransform
替代了,即通过GameObject.Tranform访问的属性仍然是RectTransform的属性
 如何直接访问一个物体的RectTranform组件? 1)GetComponent<T>() 2)通过GUI组件(Image,RawImage,Text,Mask...),它们持有本物体RectTransfrom的实例

Properties:
localPosition(vector2):局部坐标,实际上是子矩形的中心点(pivot)相对于父矩形中心点的相对位置


Properties:(重难点,动态绘制UI矩形的基础):
vector2 AnchoredPosition:UI元素中心点(Pivot)相对于其锚点位置的二维向量;换句话说,AnchoredPostion是四个锚点的中心点到中心点Pivot的二维向量
            该值的本质:控制UI元素的位置,UI控件最终的位置=四锚点中心位置+AnchorsPosition
            参考系:UI元素的四锚点的中心点
监视面板上的PostionX 和Position Y都是AnchorsPostion
不要误以为监视面板的x和y是矩形的LocalPostion,仅当锚点中心与父级的Pivot点重合时,其LocalPosition才与AnchorPostion相等




public Vector2 sizeDelta;尺寸增量=>设置UI矩形的尺寸
            官译表达了两种极端的特殊情况:SizeDelta它代表着RectTransform相对于锚点之间距离的尺寸 
            1)如果四个锚点相聚一点,那么SizeDelta的尺寸恰等于矩形的宽高;
            2)如果锚点恰分散在父物体的四个角落,那么SizeDelta就代表UI矩形比父级物体大多少或者小多少(the sizeDelta is how much bigger or smaller the rectangle is compared to its parent.)
一般性归纳:
          该值的本质:控制(决定)UI元素的尺寸大小(使得代码控制UI尺寸成为可能)
UI元素的宽(Rect.Width)=锚点宽度+SizeDelta.x;
UI元素的高(Rect.Height)=锚点高度+SizeDelta.y;
          参考尺寸:即四锚点之间的距离          
改变它们的值相当于整体缩放了一次矩形,Pivot值和Postion值都不会变化
一句话概括:UI元素矩形的最终尺寸=锚点矩形尺寸+SizeDleta              
简单的案例1:在程序中将一个UI矩形往下拉升(中心点需要设置在上变边框)
using UnityEngine;
public class Content : MonoBehaviour
{
    public RectTransform rt;
    private void Awake()
    {
        rt= GetComponent<RectTransform>();
    }

    void Start()
    {
    	//中心点设置为上边框的中点
        rt.pivot = new Vector2(0.5f, 1);
    }

    void Update()
    {
    	//每帧矩形高度加1
        rt.sizeDelta += new Vector2(0, 1);
    }
}

public Vector2 offsetMax&offsetMin;最大/最小偏移(单位:pixcel)=>设置UI矩形顶点的位置
        offsetMax:UI元素矩形的右上角相对于右上锚点的位置;
         offsetMin:UI元素矩形的左下角相对于坐下锚点的位置;
        它们的本质:控制UI矩形右上角(左下角)的位置
注意:最大/最小偏移修改的是矩形顶点的位置(而不是锚点的位置),这两个值可以在不修改中心点的情况下,控制一个矩形的绝对定位,比如希望一个矩形的下边框绘制于另一个矩形的上边框(sizedelta无法确定矩形的位置)
        参考系:右下角锚点(或左上角锚点)的位置
        改变它们的值相当于拖拽了一次矩形,所以它们的Pivot不会变化,Postion可能变化
tips:这种控制实际会同时影响到SizeDelta和position的值,产生牵一发而动全是的效果
        猜测:RectTransfrom.Rect设置成只读的原因,它本身就是一个通过RectTransform其他属性值所计算出来的结果值,它并不能控制UI控制的长宽,而是其他属性控制的结果
简单的案例2:仍然在一个程序中将一个UI元素往下拉伸(中心点保持在矩形的中心,所以Position会变化)
using UnityEngine;
public class DrawScale : MonoBehaviour
{
    public RectTransform rc;
    private void Awake()
    {
        rc = GetComponent<RectTransform>();
    }

    private void Update()
    {
        rc.offsetMin += new Vector2(0, -1);
    }
}

public vector2 anchorMax&anchorMin  最大/最小锚点(单位:父级矩形的长和宽为单位1)=>设置锚点的位置
        anchorMax:UI矩形的右上锚点在父级矩形上的标一(Normalized)位置((1,1)代表锚点在父级矩形的右上方)
        anchorMin:UI矩形的坐下锚点在父级矩形上的标一(Normalized)位置((1,1)代表锚点在父级矩形的右上方)
        它们的值实际就是RectTransform面板中anchorMax和anchorsMin的值
        
                                                                                                                                                    
Rect rect{get;}:矩形(只读),它包含了矩形的位置(x,y),宽度以及高度




Functions:
        掌握Recttransform的属性值,就完全可以自己动态绘制UI,而它还提供两个非常好用的绘制UI矩形的方法:
public void SetSizeWithCurrentAnchors(Axis axis,float size);依据当前锚点,设置当前矩形的尺寸;第一个参数表示设置尺寸的方向;
        1)这个设置SizeDleta的效果相同,中心点的位置和Postion不会改变,且设置后的值就是矩形的长/宽(更加直观)
        2)这个方法设置完尺寸后,UI元素仍然受到父级物体的矩形变化影响,如果不希望,直接设置其锚点为聚合即可
        3)Scroll View里的Content设置了中心点在左上角,所以它可以利用这个方法对其拉伸
案例3:仍然在程序中将一个UI矩形往下拉升(中心点和Position不会变)
using UnityEngine;
public class DrawScale : MonoBehaviour
{
    public RectTransform rc;
    private void Awake()
    {
        rc = GetComponent<RectTransform>();
    }

    private void Update()
    {
       rc.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, rc.rect.height + 1);
    }
}
案例1与案例3结果完全相同

public void SetInsetAndSizeFromParentEdge(RectTransform.Edge edge, float inset, float size);设置一个UI矩形到父级指定边的距离,同时设置其大小
edge:父级指定的边;
inset:UI元素到指定边的距离
size:UI元素的尺寸
这个方法会在布局时,将UI元素的锚点固定在Egde边上,这样无论父级如何变化,子UI不会变化;如果在同一帧调用了两次这个方法,一次水平设置,一次垂直设置,
那么锚点会设置在父级矩形两个对应边夹角的顶点
在编写脚本布局行为时,该方法尤其有用,因为它使得指定相对于父边缘的位置变得简单,而无需关注锚定功能。
























Inherited Members(from Transform)
public Vector3 position; 矩形在世界坐标系中的位置坐标;
public Vector3 localPosition; 局部位置坐标,即相对于父物体transform.position的相对坐标(如果没有父物体,Transform.localPostion=Transfom.position)
unity中,位置坐标position中1代表1米的长度,局部坐标亦是如此,
在UI元素中,localposition实际就是parent.postion-this.tranfrom.postion(就是父子的pivot(基准点)关于世界坐标系的向量差值),它和物体的尺寸,锚点没有关系,不要混淆

posted @ 2020-12-03 10:48  章校长  阅读(779)  评论(0编辑  收藏  举报