如何计算RectTransform中的sizeDelta?

30

我编写了一个自定义内容适配器,它是我自定义布局所需的。因此,当锚点不同时,我需要控制RectTransform.sizeDelta属性,但我无法获取显示该值的方法。
我不需要Unity3D API参考资料,我读过它,但并没有得到解释,因为它只是说:

这个RectTransform相对于锚点之间的距离的大小。如果锚点在一起,则sizeDelta与size相同。 如果锚点在父对象的四个角上,则sizeDelta是矩形相对于父对象增大或缩小的比例。

有人能用普通语言解释一下这是什么意思吗?当锚点不同时,我如何手动计算它呢?

3个回答

63

这个定义有点令人困惑。

sizeDelta 返回的基本上是 UI 元素实际矩形和锚定矩形之间的差异。

例如,给定一个 300x200 的矩形:

锚点与矩形角落重合: sizeDelta 是 (0,0) enter image description here

左或右锚定处于矩形宽度的一半位置: sizeDelta 是 (150,0) enter image description here enter image description here

四个锚点在一个点上: sizeDelta 是 (300,200)(即:与矩形大小相同) enter image description here enter image description here

正如您所见,定义锚定矩形的中心位于何处并不重要,唯一重要的是元素矩形和锚定矩形之间宽度和高度的差异。

在伪代码中,它是这样的:

sizeDelta.x = UIElementRectangle.width - AnchorsRectangle.width;
sizeDelta.y = UIElementRectangle.height - AnchorsRectangle.height;

所以,如果UI矩形的尺寸大于锚点的尺寸,sizeDelta是正数;如果它小于锚点的尺寸,sizeDelta是负数。


谢谢!你帮了我很多! - Denis Sologub
所以,这是否意味着:ElementSize = sizeDelta + (anchorMax - anchorMin)? - Hacky
@Hacky 矩形大小可以从 myRectTransf.rect.size 获取,这与您问题中的公式不同。此外,您可能需要通过 myRectTransf.localScale 进行缩放(我不确定缩放是否必要)。 - Kari

12

sizeDelta: 如果您在搜索时,因为需要解释sizeDelta的含义,如GetComponent().sizeDelta.y,然后请先放空您的思维。

想象一个小面板(PANEL),静止在大画布(CANVAS)之上,即它的父对象。在面板的矩形变换(Rect Transform)组件中,定义了两个矩形:

(a) 锚定点定义的矩形,即那些三角形。通常与父对象的位置和尺寸有关,本例中是CANVAS。

(b) 面板自身尺寸定义的矩形。

sizeDelta = (b) - (a)

就是这样。因为通常交互式组件,比如按钮,在与其所依赖的对象(例如面板)相比较时尺寸要小得多,因此sizeDelta通常为负值。按钮尺寸-面板尺寸=负值,通常如此。你知道一般设计理论中使用的负空间(Negative Space)这个术语吗?想想看,就像是按钮在面板上留下的未被利用的空间。

示例:如何找到一个面板的高度,该面板是Canvas中的子项,而Canvas又是相机覆盖的,因此具有屏幕大小。面板的锚定点与Canvas尺寸有关。脚本位于面板对象上:

panelHeight = Screen.height + this.GetComponent().sizeDelta.y;

记住,sizeDelta通常为负值,因此它更像是这个伪代码:

panelHeight = Screen.height - this.sizeDelta.y

希望这可以帮助您,曾经让我疯狂了一段时间。祝你好运!

参考文献:

https://www.youtube.com/watch?v=VhGxKDIKRvc

https://www.youtube.com/watch?v=FeheZqu85WI


0
public Vector2 ActualSize(RectTransform trans, Canvas can)
{
    var v = new Vector3[4];
    trans.GetWorldCorners(v);
    //method one
    //return new Vector2(v[3].x - v[0].x, v[1].y - v[0].y);

    //method two
    return RectTransformUtility.PixelAdjustRect(trans, canvas).size;
}

此函数在开始时运行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接