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

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

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

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

【问题讨论】:

    标签: unity3d unityscript unity3d-ui


    【解决方案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中起作用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-14
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2021-09-09
        • 2017-11-14
        • 2017-10-26
        • 1970-01-01
        相关资源
        最近更新 更多