21

我有一个带有渲染模式世界空间集的 UI 画布。对于属于此画布的所有 UI 元素,我在编辑器的 RectTransform 组件中看到了“left”、“right”、“top”和“bottom”变量。有什么方法可以通过代码访问这些变量?

4

5 回答 5

42

那些将是

RectTransform rectTransform;

/*Left*/ rectTransform.offsetMin.x;
/*Right*/ rectTransform.offsetMax.x;
/*Top*/ rectTransform.offsetMax.y;
/*Bottom*/ rectTransform.offsetMin.y;
于 2015-06-11T14:53:16.163 回答
6
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;博士

根据 Inspector 中显示的值,我的分析是,Left如果相应的边界在.RightTopBottomRectTransform

offsetMin.x一如既往Left地履行这一评估,但作为offsetMin.y和不这样做。BottomoffsetMax.xRightoffsetMax.yTop

我只是取了相反的值offsetMax来使其兼容(基本空间修改)。

于 2015-11-26T21:52:44.343 回答
4

上面的两个答案有点在正确的轨道上,因此我一直在拖延我的项目,但在床上编程时发现了。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);
}

如果您将其插入一个虚拟类,无论您使用什么锚,它都应该为您提供正确的读数。

它的工作方式应该是显而易见的,但一个小的解释不会有什么坏处。

偏移量是指最小值和最大值与矩形变换中心点的位置差异,将它们添加到锚边界会给出正确的矩形变换的最小值和最大值。虽然锚的最小值和最大值是标准化的,所以你需要通过乘以屏幕尺寸来缩小它们。

于 2015-12-30T14:25:41.143 回答
3

您还可以更轻松地在两行中设置所有值。只需获取 Vector2 的 offsetMin 并设置两个参数(第一个是 Left,第二个是底部)。然后对 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);

我希望它会帮助别人;)

于 2018-04-15T21:50:04.587 回答
0

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

我为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);
于 2020-11-13T09:30:07.873 回答