如何通过代码访问 RectTransform 左、右、上、下位置?

How to access RectTransform's left, right, top, bottom positions via code?

我有一个 UI Canvas 设置了渲染模式世界 space。对于属于此 canvas 的所有 UI 元素,我在 RectTransform 组件中看到 'left'、'right'、'top' 和 'bottom' 变量编辑。有什么方法可以通过代码访问这些变量?

那些会是

RectTransform rectTransform;

/*Left*/ rectTransform.offsetMin.x;
/*Right*/ rectTransform.offsetMax.x;
/*Top*/ rectTransform.offsetMax.y;
/*Bottom*/ rectTransform.offsetMin.y;
RectTransform rt = GetComponent<RectTransform>();
float left   =  rt.offsetMin.x;
float right  = -rt.offsetMax.x;
float top    = -rt.offsetMax.y;
float bottom =  rt.offsetMin.y;

TL;DR

根据检查器中显示的值,我的分析是如果相应的边界在矩形中,LeftRightTopBottom 为正由 RectTransform.

的锚点塑造

offsetMin.x as Left and offsetMin.y as Bottom 始终满足此评估但是 offsetMax.x as Right and offsetMax.y因为 Top 没有。

我只是取了 offsetMax 的相反值以使其符合要求(基本 space 修改)。

以上两个答案还算对,我的项目因此拖延了一段时间,但在床上编程时才发现。 offsetMin 和 offsetMax 是您所需要的,但它们不是全部,您需要包括来自 rect 变换的锚点:

public RectTransform recTrans;

// Use this for initialization
void Start () {
    Vector2 min = recTrans.anchorMin;
    min.x *= Screen.width;
    min.y *= Screen.height;

    min += recTrans.offsetMin;

    Vector2 max = recTrans.anchorMax;
    max.x *= Screen.width;
    max.y *= Screen.height;

    max += recTrans.offsetMax;

    Debug.Log(min + " " + max);
}

如果你把它插入一个虚拟的 class 它应该给你正确的读数,不管你使用什么锚点。

它的工作方式应该是显而易见的,但简单的解释也无妨。

偏移量指的是最小值和最大值与矩形变换中心点的位置差异,将它们添加到锚边界给出正确的矩形变换的最小值和最大值。尽管锚点最小值和最大值已归一化,因此您需要乘以屏幕尺寸来缩小它们。

您还可以更轻松地在两行中设置所有值。只需获取 Vector2 的 offsetMin 并设置两个参数(第一个是 Left,第二个是 bottom)。然后对 offsetMax 做同样的事情(第一个是右边,第二个是顶部)。请记住,offsetMax 是相反的,所以如果您想设置 Right = 20,那么您需要在脚本中设置值 -20。

下面的代码设置值:

左 = 10,

底部 = 20,

右 = 30,

前 = 40

GameObject.GetComponent<RectTransform> ().offsetMin = new Vector2 (10,20);
GameObject.GetComponent<RectTransform> ().offsetMax = new Vector2 (-30,-40);

希望对其他人有所帮助 ;)

我需要经常调整这些属性,所以我添加了一种更短、更方便的方法来设置它们。

我为 RectTransform 编写了一个扩展,您可以在其中非常简单地设置这些属性:

public static class Extensions
{
    public static void SetPadding(this RectTransform rect, float horizontal, float vertical) {
        rect.offsetMax = new Vector2(-horizontal, -vertical);
        rect.offsetMin = new Vector2(horizontal, vertical);
    }

    public static void SetPadding(this RectTransform rect, float left, float top, float right, float bottom)
    {
        rect.offsetMax = new Vector2(-right, -top);
        rect.offsetMin = new Vector2(left, bottom);
    }
}

要使用扩展,您只需像这样调用方法:

var rect = YourGameObject.GetComponent<RectTransform>()

// with named parameters
rect.SetPadding(horizontal: 100, vertical: 40);

// without named parameters (shorter)
rect.SetPadding(100, 40);

// explicit, with named parameters
buyButton.SetPadding(left: 100, top: 40, right: 100, bottom: 40);

// explicit, without named parameters (shorter)
buyButton.SetPadding(100, 40, 100, 40);