Найти тему
Another Art

Работа с префабами в Unity часть 1

Оглавление

Приветствую всех друзья! В прошлой статье мы разобрались в том, что такое сцены и игровые объекты в Unity, а также в том, как с ними работать. Сегодня мы поговорим о префабах.

Пример префаба
Пример префаба

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

Если вы хотите расставить НПС (неигровые персонажи) или же, например, выставить фонари на улицах, это опять же лучше делать через префабы, нежели использовать обычный копипаст. Так как, возможно, в процессе разработки вы переработаете модель фонаря или же захотите, чтобы фонари светили в определенное время суток. В этот момент вы поймете всю мощь и пользу префабов – вам хватит пары минут для изменения одного префаба и изменения применятся ко всем его копиям. Если вы пользовались копипастом – вам придется отдельно настраивать каждый игровой объект, что как вы понимаете долго и неэффективно.

Вы также можете создавать вложенные префабы (возможно начиная с Unity 2019, раньше такой возможности не было), тем самым можно делать сложные иерархии игровых объектов, которые легко редактировать на нескольких уровнях. Однако это не означает что все префабы должны быть идентичны, вы также можете создавать варианты префабов, или переопределять какие-то их свойства.

Вы также должны использовать префабы если какой-то игровой объект (например, снаряд) должен появляться во время выполнения игры.

Создание префаба.

Для того чтобы создать префаб перенесите игровой объект с помощью мыши из окна иерархии в окно проекта. Для префабов я также рекомендую сделать отдельную папку и структурировать их в ней. После переноса игрового объекта в окно проекта будет создан ассет префаба содержащий в себе игровой объект, все его компоненты, а также если внутри него были вложенные игровые объекты – они также станут частью этого префаба.

Так префабы отображаются в окне проекта в зависимости от того, как вы его настроили (в одну или две колонки).
Так префабы отображаются в окне проекта в зависимости от того, как вы его настроили (в одну или две колонки).

Как только вы создали префаб – игровой объект, из которого он был создан также становится префабом на сцене, а в окне иерархии он начинает выделяться синим кубом:

Вид префаба в окне иерархии
Вид префаба в окне иерархии

Создать префаб на сцене можно двумя способами:

1. Перетащить его мышкой из окна проекта на окно сцены или иерархии

2. С помощью кода, о чем я еще буду писать в своих будущих статьях

Префаб можно заменить на новый игровой объект перетащив его из окна иерархии на уже существующий префаб в окне проекта. Будьте внимательны так как при замене Unity пытается сохранить все ссылки и правильно заменить префаб, но, если внутри игрового объекта есть несколько других с одинаковым именем – замена может произойти непредсказуемо.

Редактирование префаба в окне редактирования префаба.

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

Есть несколько способов для открытия окна редактирования префаба:

1. Дважды кликните на него в окне проекта

2. Использовать кнопку стрелку рядом с префабом в окне иерархии

3. Кликнуть на кнопку Open Prefab в окне инспектора (для этого необходимо предварительно выбрать префаб в окне проекта).

Кнопка стрелка в окне иерархии
Кнопка стрелка в окне иерархии

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

Пример открытого префаба в редакторе префабов
Пример открытого префаба в редакторе префабов

При открытии редактора префабов, панель инструментов иерархии и окна сцены немного изменяется. В окне сцены появляется заголовок того префаба, что на данный момент открыт, а также переключатель AutoSave позволяющий управлять процессом сохранения при изменении префаба. Если она отключена, то любое сохранение как сцены, так и проекта приведет к сохранению изменений в префабе. В окне иерархии появляется заголовок открытого префаба, а рядом с ним стрелка, которая позволяет двинуться на шаг назад, как например вы это делаете в браузере. Например, вы открыли префаб в сцене – тогда при нажатии на эту стрелку вы выйдите из редактора префабов и попадете обратно на сцену.

Стрелка позволяющая выйти назад из редактора префабов
Стрелка позволяющая выйти назад из редактора префабов

Отменить изменения в редакторе префабов можно только пока вы не вышли из него. В противном случае изменения необратимы.

Если вам важно редактировать ваш префаб в окружении близком к сцене, где он потом будет находиться, а не на одноцветном фоне как это происходит по умолчанию, вы можете настроить это. Для этого перейдите в Edit\Project Settings в контекстном меню, что находится в верхней части редактора. Далее перейдите во вкладку Editor и найдите секцию Prefab Editing Environment. В ней находится всего 2 пункта Regular Environment это окружение для префабов у которых нет UI элементов и UI Environment для префабов с UI элементами. Префаб без UI считается тот, у которого есть компонент Transform. Префабом с UI считается тот у которого вместо Transform, есть компонент RectTransform. В будущих статьях мы еще будем разбирать оба этих компонента более подробно. Еще одним плюсом настройки такого окружения является то, что мы не можем выбрать его для редактирования, редактировать мы можем только открытый префаб.

Секция настройки окружения редактора префабов
Секция настройки окружения редактора префабов

Переопределение префабов.

Переопределение префабов позволяет создавать вам вариации между экземплярами префабов, при этом не теряя связь этих экземпляров с ассетом префаба. Когда вы изменяете ассет префаба, то изменения влияют на все экземпляры префаба на сцене. Однако изменение свойств у экземпляра префаба не влияет на ассет префаба, если вы не примените эти изменения к ассету префаба.

Существует четыре различных типа переопределения экземпляров префаба:

1. Переопределить значение свойства

2. Добавить компонент

3. Удалить компонент

4. Добавить дочерний игровой объект

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

Переопределение свойств экземпляра префаба отображается в окне иерархии. Все переопределенные свойства помечаются жирным шрифтом, а также напротив них появляется синяя метка (линия слева от свойства). Если же компонент добавлен как новый, все его свойства будут написаны жирным шрифтом, а также помечены рядом синей линией, а кроме того на иконке компонента будет стоять +. Если же вы удалили компонент с экземпляра префаба, то в иерархии это будет выглядеть как иконка компонента с значком -.

Так выглядит измененный экземпляр префаба
Так выглядит измененный экземпляр префаба

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

Необходимо помнить, что Transform и RectTransform не являются переопределяемыми, так как чаще всего мы хотим расставлять наши префабы в разных местах и с разным вращением, то Unity автоматически считает эти поля не переопределяемыми. Обычно позиция, вращение и прочие параметры Transform и RectTransform выставляются через код.

На сегодня это все. В следующей статье я продолжу рассказ о префабах в Unity. Спасибо всем, кто дочитал эту статью до конца, подписывайтесь на канал, ставьте лайки, а для тех, у кого появились вопросы - спрашивайте в комментариях! А если вы хотите помочь данному каналу в развитии – делитесь этой статьей с друзьями в социальных сетях!

МОЙ КАНАЛ НА YOUTUBE | ГРУППА МОЕЙ ИНДИ ИГРЫ В VK