UGUI中RectTransfrom计算方式的实现


前言

上一篇文章分享了UGUI中RectTransform的基本使用方式,这篇来补下“实现方式”。


一、Anchor是什么意思?

官网定义:The anchor points for the lower left corner and the upper right corner of the rectangle。

anchor表示父节点被对齐的边界,这个边界就可以用矩形来描述。
anchor有两个数据:min和max。分别代表这个矩形的左下角和右上角。
这个值不像pivot,你可以设置很大的值,只可以是0-1。相对应地,表示自身的百分比。

示例:例如左下角就是(0,0)。右上角就是(0,1)。(0.5,0.5)就表示中间了。

会找到这个边界,再根据偏移值进行偏移。

相对应地,就是子节点的左下角对父节点min进行偏移,子节点的右上角对齐父节点的max

二、实现原理

对于开发者来说,似乎有两种对齐的思路。难道内部也需要保存两套数据么?来看看内部保存的数据。

1.属性

我们把Inspector设为Debug模式,可以看到。没有宽高,也没有top、bottom、left、right。取而代之的是sizeDelta。那搞懂这个变量有什么用就是关键了。
Debug模式下的数据
这是网上的RectTransform属性
属性一览

2.数学原理

根据上面的定义

父节点max指向子节点max为offsetMax
=> offsetMax = rectMax - anchorMax
同理,父节点minx指向子节点min为offsetMin
=> offsetMin = rectMin - anchorMin

而sizeDelta = offsetMax - offsetMin
推导一下:
offsetMax - offsetMin = (rectMax - anchorMax) - (rectMin - anchorMin)
= (rectMax - rectMin ) - (anchorMax- anchorMin)
= 子节点左下角指向右上角 - 父节点min指向max
= 子节点尺寸 - anchor尺寸
那么,当我们对齐的中心点为一个点(例如父节点的中心),那么sizeDelta就等于子节点自身的宽高。

其实直接记结论就可以了。

这篇文章写得比我好,虽然可能不是原作者: 链接.

3.接口介绍

SetSizeWithCurrentAnchors(axis, size)
// 单独设置某个方向上的尺寸信息,axis表示水平或垂直。不会影响anchor信息
SetInsetAndSizeFromParentEdge(edge, inset, size)
// edge表示top\bottom\left\right,对应哪条边
// inset表示距离
// size表示当前边的尺寸
// 会修改anchor信息,单更容易得到想要的结果

小结

简单说了下内部保存的属性,没有详细讲。

小tips:如果我们想设置不同父节点下子节点的位置,而用position又出现问题的时候。不妨试一下anchoredPosition,很多问题就解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值