Типы Координат, Используемые В Графическом Интерфейсе Unity3D



Почему разновидности и сколько их? Я часто сталкиваюсь с тем, что люди просто не понимают, как переместить объект в пользовательском интерфейсе на какое-то значение, и удивляются, что результат зачастую непредсказуем.

Или скажем, как получить правильные координаты объекта в пользовательском интерфейсе.

Если мы отобразим обычное положение объекта через отладчик, оно будет сильно отличаться от того, что мы видим в инспекторе UI-элемента, так что же мы там видим и как это работает? В итоге по форумам ищут 100500 решений, пока одно из них не работает. Я хочу придать таким процессам осмысленное движение.

Суть подвоха в следующем — у обычного Transform есть потомок RectTransform, который отвечает за положение и многие вещи, связанные с размером, масштабом и т. д. UI-элемента.

И благодаря этому мы можем получить следующие варианты координат.

  1. позиция
  2. локальная позиция
  3. anchoredPosition (есть ещеnchoredPosition3D, но мы не будем рассматривать его отдельно, а будем считать подтипом test.anchoredPosition


Типы координат, используемые в графическом интерфейсе Unity3d



Обычная позиция

Обычная позиция вообще не относится к системе координат пользовательского интерфейса слова.

Это некие общие координаты объекта во всем мире модуля, причем в мире существует некоторое представление положения объекта, не связанное с интерфейсом.

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

А в глобальных координатах это не пиксели.

Поэтому объект сместится в мире, скажем, на 200 единиц мирового измерения, а не на 200 пикселей, и просто улетит в неизведанные дали.

Но его можно использовать с умом.

Я расскажу тебе как позже.



Позиция привязки (anchoredPosition)

Что мы видим в инспекторе, то и есть.



Типы координат, используемые в графическом интерфейсе Unity3d

В Unity вы можете устанавливать опорные точки; это определенная точка, относительно которой будет располагаться элемент пользовательского интерфейса, в том числе при изменении размера/пропорций родительского объекта.



Типы координат, используемые в графическом интерфейсе Unity3d

Здесь вы можете видеть, что мы изменили размер родительского объекта и пропорции, наш объект придерживается центра родительского объекта, а его координаты не изменились, хотя на экране он уже не находится в том же месте, что и раньше.

Позиция якоря – координаты объекта относительно якоря.

Установим привязку в левый верхний угол и увидим, что координаты изменились.



Типы координат, используемые в графическом интерфейсе Unity3d

Если вы хотите сдвинуть объект по его ширине, вам нужно изменитьnchoredPosition или localPosition. Локальная позиция элементов пользовательского интерфейса также рассчитывается в пикселях, но другим способом.

Итак, если вам нужно манипулировать двумя элементами пользовательского интерфейса относительно друг друга.

Лучше использовать локальную позицию.

Почему?

Локальная позиция (localPosition)

Итак, что такое местная позиция:

Типы координат, используемые в графическом интерфейсе Unity3d

Это система координат, в которой центр родительского объекта равен 0. Верхний правый угол — это положительная ширина прямоугольника, разделенная пополам.

Удаляется верхнее левое отрицательное значение ширины.

То есть, если ширина прямоугольника 800 пикселей, то x = 0 в середине, 400 в правом верхнем углу и -400 в левом верхнем углу.

Поэтому, если вам нужно рассчитать координаты без учета якорей, лучше использовать локальные позиции.

При условии, что у них есть общий предок/прямик.

Кстати, якорями можно пользоваться не только как конкретную точку на родительском объекте, но и как пропорции относительно родительского объекта.

Во втором случае,nchoredPosition вернет localPosition. Почему вы можете использовать обычную позицию для элементов пользовательского интерфейса? Скажем так, в рамках глобальных координат, если одному объекту присвоены координаты второго, то они будут располагаться в одной и той же точке, независимо от их привязок или локальных положений, иногда это удобно - когда элементы находятся на разных холсты/в разных панелях и системы координат локальные/якоря не совпадают.

Заключение/результат

  1. В инспекторе элементы пользовательского интерфейса показывают привязанную позицию или пропорции относительно родительского объекта.

    AnchoredPosition рассчитывается в зависимости от положения якоря.

  2. localPosition позволяет получить общие координаты относительно родителя без привязки к якорям.

  3. позиция — это глобальная позиция элемента в пространстве сцены, не привязанная к пользовательскому интерфейсу.

Надеюсь, это кому-то поможет :-) Теги: #Разработка игр #gamedev #unity #ui #разработка игр #unity3d #indie gamedev
Вместе с данным постом часто просматривают: