Unity3d 如何在RectTransform中计算sizeDelta?

Unity3d 如何在RectTransform中计算sizeDelta?,unity3d,unityscript,unity3d-ui,Unity3d,Unityscript,Unity3d Ui,我编写了一个自定义内容装配器,它是我的自定义布局所必需的。因此,我需要控制RectTransform.sizeDelta属性,当锚点不相同但我无法获得显示此值的属性时。 我不需要Unity3D API参考,我读了它,什么都没有,因为它只说: 此矩形变换的大小相对于 锚定。如果锚固件在一起,则sizeDelta与size相同。 如果定位点位于父对象的四个角中的每一个,则 sizeDelta是矩形与之相比的大小 它的父母 有人能用正常的语言解释这是什么意思吗?当锚点不相同时,我如何手动计算它呢?这个

我编写了一个自定义内容装配器,它是我的自定义布局所必需的。因此,我需要控制
RectTransform.sizeDelta
属性,当锚点不相同但我无法获得显示此值的属性时。
我不需要Unity3D API参考,我读了它,什么都没有,因为它只说:

此矩形变换的大小相对于 锚定。如果锚固件在一起,则sizeDelta与size相同。 如果定位点位于父对象的四个角中的每一个,则 sizeDelta是矩形与之相比的大小 它的父母


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

这个定义确实有些混乱

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

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

锚定在与矩形角相同的位置:
sizeDelta
is(0,0)

左或右锚定在矩形的一半宽度处:
sizeDelta
is(150,0)

一个点中的所有四个锚点:
sizeDelta
is(300200)(即:与矩形大小相同)

正如您所看到的,锚定所定义的矩形的中心在哪里并不重要,唯一重要的是元素矩形和锚定矩形的宽度和高度之间的差异

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

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

因此,如果UI矩形的尺寸大于锚定的尺寸,
sizeDelta
为正,如果较小,
sizeDelta
为负。

sizeDelta:如果您进行了搜索,并在这里找到sizeDelta含义的解释,如GetComponent().sizeDelta.y,请清除您的想法

想象一个小面板,放在一个大画布上,它是父对象。 在面板的矩形变换组件中,定义了两个矩形:

(a) 由其定位点定义的矩形。那些三角形。通常与父对象位置和维度相关,在本例中为画布

(b) 矩形由其自身大小、面板自身尺寸定义

sizeDelta=(b)-(a)

就这样。因为通常是一个交互式组件,如按钮,与它所在的对象(如面板)相比尺寸更小,因此,通常sizeDelta为负值。按钮大小-面板大小=通常为负值。 你知道一般设计理论中的负空间这个词吗? 把它想象成面板上的按钮没有使用的空间

示例: 如何找到面板的高度,即画布的子级,画布是摄影机覆盖,因此屏幕大小。面板的锚定与画布尺寸相关。脚本位于面板对象上:

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

请记住,sizeDelta通常为负数,因此其读起来更像以下伪代码:

panelHeight=Screen.height-this.sizeDelta.y

希望这对你有帮助,让我疯狂了一段时间。干杯

参考文献:


此功能在开始时工作

谢谢!你帮了我很大的忙!那么,这是否意味着:ElementSize=sizeDelta+(anchorMax-anchorMin)?@Hacky矩形大小可以从myRectTransf.rect.size中获得,这将不同于您所问的公式。另外,您可能需要通过
myRectTransf.localScale
来缩放它(不过我不确定是否要缩放)。
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;
}