Как получить доступ к позициям 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);