0 概述
UIRect是一个抽象类. 不能被实例化.
UIRect是UIPanel和UIWidget的基类.它为UIPanel和UIWidget提供了一些公用的方法.
1 UIRect.AnchorPoint
AnchorPoint(锚点)用于 定位对象相对于目标对象 在水平或垂直方向的位置。
Transform target 即目标对象.
UIRect rect 即目标对象上绑定的UIRect组件. 可能为null.
Camera targetCam 为负责渲染目标对象这一层的Camera.
int absolute为对象相对于目标对象在水平或垂直方向的偏移量。
float relative有三个取值0f、0.5f、1f。
锚点应用于UIRect上. UIRect有上下左右4个锚点.分别用于定位4条边的位置.
若目标对象无对应的UIRect时,目标对象的位置即其中心点的位置(target.position)
通过对对象UIRect的worldCorners[0](bottom-left corner)和worldCorners[1](top-left corner)进行线性插值计算出UIRect的左边中心点.
若目标对象有对应的UIRect时,锚点定位对象相对于目标对象水平方向的位置时分为left、center和right对齐,垂直方向则分为top、center和bottom对齐。
这种情况下在Unity编辑器中设置好一个锚点后,可以随时在left/center/right和top/center/bottom间切换
NGUI会保持对象的位置并且动态计算出新的对齐方式下对象与目标对象的偏移量。
Explanation Local Vs Global Space
这篇文章介绍了 本地空间 和 全局空间.
主要在于去全局空间的世界坐标是唯一的.
2 成员变量
一个矩形区有上、下、左、右四边,因此UIRect中有4个锚点分别指示这四边anchor的位置.
有bottom-left、top-left、top-right、bottom-right四个角:
- 左下 左上 右上 右下
每个矩形区是一个UI的容器,因此UIRect可以组成一个树状结构:
BetterList mChildren即孩子节点列表
OnInit、OnDisable及ParentHasChanged时将进行动态的Add和Remove。
UIRect mParent即父节点,会从该UIRect绑定的GameObject进行回溯寻找
bool mParentFound表示其有没有进行过回溯寻找。
NGUI中UIRoot是所有UI对象的根节点,UIRect中的UIRoot mRoot就指向了该节点
bool mRootSet表示其有没有进行过回溯寻找。
UIRect里为了加速访问绑定的GameObject及其Transform做了 缓存:
protected GameObject mGo;
protected Transform mTrans;
public GameObject cachedGameObject { get { if (mGo == null) mGo = gameObject; return mGo; } }
public Transform cachedTransform { get { if (mTrans == null) mTrans = transform; return mTrans; } }
Camera mMyCam为负责渲染UIRect绑定的GameObject这一层的Camera
bool mAnchorsCached表示其以及4个锚点的数据有没有设置好。
bool mStarted:UnityEngine是否回调了Start方法
bool mChanged:父对象中有值(如alpha)改变时将其设置为true,用于刷新表现。
int mLastInvalidate:通过Time.frameCount记录下最后调用Invalidate的帧数。
int mUpdateFrame:通过Time.frameCount记录已经Update过的帧数。
3 UpdateRect
- 通过mAnchorsCached判断是否需要更新锚点的相关数据,需要则通过ResetAnchors来更新数据。
- 通过mUpdateFrame与Time.frameCount判断该帧是否已经经过Update处理,处理过则本次Update结束了
- 分别判断4个锚点是否有设置,有的话则判断该锚点的rect是否已经经过Update处理,未处理过则调用其Update方法。
- 判断4个锚点是否至少有1个有设置,则调用OnAnchor方法。
- 调用OnUpdate方法继续处理。
OnAnchor和OnUpdate方法均是抽象方法,需要由UIRect的子类自己来实现:
protected abstract void OnAnchor ();
protected virtual void OnUpdate () { }