Если вы создаёте динамичный интерфейс, где его элементы должны появляться, исчезать или ещё как-то изменяться под действием со стороны игрока или других событий в игре, тогда возможно вам понадобится создать скрипт, который будет инстанциировать новые элементы интерфейса основываясь на созданной вами для этого логике.
Для того, чтобы с лёгкостью динамично инстанциировать элементы интерфейса, сначала нужно создать префаб для типа элемента интерфейса, который будете потом инстанциировать. Настройте нужный вам элемент интерфейса в сцене, затем перетащите его в 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.