如何计算 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 Scale Handler - 如何在Runtime运行时拖动缩放窗口尺寸