Как получить доступ к позициям RectTransform слева, справа, сверху и снизу через код?

У меня есть пользовательский интерфейс Canvas с режимом рендеринга мирового пространства. Для всех элементов пользовательского интерфейса, которые принадлежат этому холсту, я вижу переменные 'left', 'right', 'top' и 'bottom' в компоненте RectTransform в редакторе. Есть ли способы получить доступ к этим переменным через код?

4 ответа

Решение

Это будет

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

Исходя из значений, отображаемых в Инспекторе, мой анализ таков, что Left, Right, Top а также Bottom положительны, если соответствующие границы находятся в прямоугольнике, сформированном якорями RectTransform,

offsetMin.x как Left а также offsetMin.y как Bottom всегда выполнять эту оценку, однако offsetMax.x как Right а также offsetMax.y как Top не.

Я просто взял противоположные значения offsetMax сделать его совместимым (базовая модификация пространства).

Два вышеупомянутых ответа вроде как на правильном пути, из-за этого я откладывал свой проект, но выяснил это, когда программировал в постели. Это то, что вам нужно, это offsetMin и offsetMax, но это не все, вам нужно включить якоря из прямоугольного преобразования:

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);
}

Если вы подключите его к фиктивному классу, он должен дать вам правильные показания независимо от того, какие якоря вы используете.

То, как это работает, должно быть очевидным, но небольшое объяснение не повредит.

Смещения относятся к разнице в положениях min и max от центральной точки прямоугольного преобразования, добавление их к границам привязки дает правильные минимальные и максимальные значения прямоугольного преобразования. Хотя минимальные и максимальные значения привязки нормализованы, вам нужно уменьшить их, умножив на размер экрана.

Вы также можете проще установить все значения в две строки. Просто возьмите offsetMin (Vector2) и установите два параметра (первый слева и второй снизу). Затем сделайте то же самое с offsetMax (первый справа, а второй сверху). Помните, что offsetMax перевернут, поэтому, если вы хотите установить Right = 20, вам нужно установить значение -20 в скрипте.

Код ниже устанавливает значения:

Слева = 10,

Низ = 20,

Справа = 30,

Top = 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);
Другие вопросы по тегам