如何计算 RectTransform 中的 sizeDelta?

Posted

技术标签:

【中文标题】如何计算 RectTransform 中的 sizeDelta?【英文标题】:How to calculate sizeDelta in RectTransform? 【发布时间】:2017-06-10 09:10:00 【问题描述】:

我编写了自定义布局所需的自定义内容调整器。因此,当锚点不同时,我需要控制 RectTransform.sizeDelta 属性,但我无法显示此值。 我不需要 Unity3D API 参考,我读了它并没有得到任何内容,因为它只说:

这个 RectTransform 的大小相对于它们之间的距离 锚。如果锚点在一起,sizeDelta 与 size 相同。 如果锚点位于父节点的四个角中,则 sizeDelta 是与矩形相比更大或更小的多少 它的父级。

谁能用普通语言解释一下这是什么意思?锚点不同时如何手动计算?

【问题讨论】:

【参考方案1】:

确实,这个定义有些混乱。

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

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

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

矩形一半宽度的左侧或右侧锚点:sizeDelta 为 (150,0)

一个点中的所有四个锚点:sizeDelta 为 (300,200)(即:与矩形大小相同)

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

在伪代码中是这样的:

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

因此,如果 UI Rectangle 的尺寸大于锚点的尺寸,sizeDelta 为正数,如果更小,sizeDelta 为负数。

【讨论】:

谢谢!你帮了我很大的忙! 那么,这是否意味着:ElementSize=sizeDelta + (anchorMax - anchorMin) ? @Hacky 矩形大小可以从myRectTransf.rect.size 获得,这将与您的问题的公式不同。此外,您可能需要将其缩放myRectTransf.localScale(虽然我不确定缩放)。【参考方案2】:

sizeDelta:如果您进行了搜索,并最终在此处解释 sizeDelta 的含义,例如 GetComponent().sizeDelta.y,那么请理清思路。

可视化一个小 PANEL,它位于一个大 CANVAS 的顶部,它是 Parent 对象。 在 PANEL 的 Rect Transform 组件中,定义了 2 个矩形:

(a) 由其 Anchors 定义的矩形。那些三角形。通常与父对象的位置和尺寸相关,在本例中为 CANVAS。

(b) 由它自己的大小定义的矩形,面板自己的尺寸。

sizeDelta = (b) - (a)

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

示例: 如何找到面板的高度,即作为相机叠加层的 Canvas 的子级,从而确定屏幕大小。面板的锚点与画布尺寸相关。脚本在 Panel 对象上:

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

【讨论】:

【参考方案3】:
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;

这个函数在start中起作用

【讨论】:

以上是关于如何计算 RectTransform 中的 sizeDelta?的主要内容,如果未能解决你的问题,请参考以下文章

Unity UGUI 修改好了RectTransform的值但是重启工程后RectTransform会自己变化,如何解决呢

Unity——RectTransform详解

检查 UI 元素/RectTransform 是不是重叠

Unity RectTransform Scale Handler - 如何在Runtime运行时拖动缩放窗口尺寸

Unity3d中UGUI组件精简复盘RectTransform组件

Unity3D-UGUI原理篇RectTransform 组件详解