Создание элементов интерфейса путём скриптинга
Если вы создаёте динамичный интерфейс, где его элементы должны появляться, исчезать или ещё как-то изменяться под действием со стороны игрока или других событий в игре, тогда возможно вам понадобится создать скрипт, который будет инстанциировать новые элементы интерфейса основываясь на созданной вами для этого логике.
Создание префаба элемента интерфейса
Для того, чтобы с лёгкостью динамично инстанциировать элементы интерфейса, сначала нужно создать префаб для типа элемента интерфейса, который будете потом инстанциировать. Настройте нужный вам элемент интерфейса в сцене, затем перетащите его в Project View, чтобы конвертировать его в префаб.
К примеру префабом для кнопки может быть игровой объект (Game Object) с Image и Button компонентом, и дочерний игровой объект с Text компонентом. Ваши настройки могу отличаться между собой, в зависимости от того, что вам в данный момент нужно сделать.
Вы можете задаться вопросом, почему мы не используем API методы для создания разных типов контроллеров, включая визуальную часть и многое другое. Сделано так было, потому что существует бесконечное количество способов например чтобы сделать кнопку одним из элементов для настройки чего-либо. Использует она изображение, текст или и то и другое сразу? Или для работы ей нужно использовать одновременно сразу несколько изображений? Что из себя представляет к примеру шрифт, его цвет, размер или выравнивание? Какой спрайт или спрайты должно будет использовать изображение? Благодаря тому, что вы можете создать любой префаб и инстанциировать его, вы получаете возможность настроить его так, как вам нужно. Если же вам потом захочется изменить поведение и отображение какого-либо элемента интерфейса, вы просто сможете отредактировать нужный вам префаб и применённые изменения тут же отразятся в вашем интерфейсе, включая динамически созданный интерфейс.
Инстанциирование элемента интерфейса
Префабы элементов интерфейса инстанциируются как обычные используя метод Instantiate. При назначении родительского элемента в качестве инстанциируемого элемента интерфейса, рекомендуется делать это с использованием метода Transform.SetParent вкупе со значением параметра worldPositionStays выставленным в false.
Позиционирование элемента интерфейса
Элемент интерфейса позиционируется там где нужно используя компонент Rect Transform. Если элемент интерфейса является потомком компоновочной группы (Layout Group), тогда он будет автоматически позиционирован там где нужно без необходимости делать это вручную.
При позиционировании компонента Rect Transform бывает полезным сперва определить имеет или должен ли он иметь свойство растягиваемости. Данное свойство вступает в действие, когда параметры anchorMin и anchorMax не соответствуют друг другу.
Для того, чтобы сделать Rect Transform нерастягиваемым, его позиция задаётся попросту через свойства anchoredPosition и sizeDelta. Свойство anchoredPosition задаёт позицию точки опоры относительно привязок. Свойство sizeDelta представляет собой значение исходного размера тогда, когда нет никакого растяжения.
Для растяжения Rect Transform проще будет задать позицию используя свойства offsetMin и offsetMax. Свойство offsetMin задаёт угол левого нижнего угла прямоугольника относительно левой нижней привязки. Свойство offsetMax задаёт угол правого верхнего угла прямоугольника относительно правой верхней привязки.
настройка элемента интерфейса
Если вы инстанциируете несколько элементов интерфейса динамически, маловероятно что вам захочется, чтобы все они выглядели и вели себя одинаково. Не важно является ли этот элемент кнопкой в меню, предметом в инвентаре или ещё чем-нибудь, вам скорее всего захочется иметь разные элементы с разными иконками и текстом и чтобы каждый из них выполнял свою уникальную функцию.
Делается это путём получения различных компонентов и изменения их свойств. Для более подробной информации по компонентам Image и Text, ознакомьтесь с соответствующими разделами документации по скриптингу и тому как работать путём скриптинга с UnityEvents.
Как UI элемент привязать к спрайту
Есть к примеру хелсбар в канвасе, который динамически создается, есть спрайт юнита. Собственно как преобразовать этот хелсбар(scale, position), что бы он отобразился на спрайте(сверху, ну с офсетом я разберусь) c преобразованным скейлом и позицией?
Всё ещё ищете ответ? Посмотрите другие вопросы с метками unity3d или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как UI объект прикрепить к gameobject?

1) взять персонажа, пересчитать его координаты в экранные или даже лучше во viewport (там они от 0 до 1);
2) а дальше уже дело техники пересчитать в координаты на канвасе.
3) делать каждый кадр
4) профит
- Вконтакте



freeExec, почему не работает код из примера?
Выдаёт MissingComponentException: There is no ‘Camera’ attached to the «Canvas» game object, but a script is trying to access it.
You probably need to add a Camera to the game object «Canvas». Or your script needs to check if the component is attached before using it.