Советы по работе с префабами в Unity
Всем привет! Меня зовут Григорий Дядиченко, и я технический продюсер. Сегодня хотелось бы обсудить работу с префабами, их организацию и несколько советов по тому, как работать с префабами и с вариантами. Насобирав несколько шишек на проектах у меня сформировалось некоторое число типовых проблем и советов при неправильной организации. Если хотите сделать работу с префабами удобнее, добро пожаловать под кат!
Что такое префаб?
В юнити довольно много удобных инструментов работы с данными, один из которых – префаб. По сути в Unity есть два вида конфигов с визуальным интерфейсом для манипулирования ими. Prefab и ScriptableObject. Если Scriptable Object больше про чистое хранение данных, то Prefab по сути конфиг “аналогичный xaml” в UWP, который позволяет реализовывать концепцию MVVM, и является в ней View. Мне в целом нравится архитектура, когда префабы – это View, компоненты – View-Model, а Scriptable Object – модель. Это довольно удобно. Но в любой другой схеме архитектуры по MVP, MVC и т.п. можно префабы считать за View.
Под капотом префаб или скриптабл обжект – это YAML конфиг. Если в Unity включена текстовая сериализация в настройках редактора то его даже можно открыть и почитать.
Структурно он обычно состоит из ссылок на другие префабы, файлы, скрипты и т.п. и наборы сериализуемых параметров. При этом тут стоит сразу сделать отступление на что такое Prefab Variant. Это такой же YAML конфиг, который похож на префаб в своей сути, но он хранит ссылку на оригинальный префаб m_SourcePrefab и его модификации m_Modification + удалённые компоненты m_RemovedComponents.
Понимать структуру префаб как конфига полезно для пакетной обработки, чтобы обрабатывать его как текст регулярными выражениями и подобными инструментами.
При этом варианты хранят только то, что изменилось, что позволяет сериализацию сделать более компактной для различных “модифицированных” версий объектов в отличии от разных префабов. Единственным исключением из этого правила является набор параметров трансформа (что больше похоже на баг Unity, чем на обоснованную фичу).
Базовые элементы
Разберём все рекомендации на простом пользовательском интерфейсе. Предположим что у нас скажем есть: магазин и награда за квест. Подобный пример позволит нам получить случаи использования похожие на правду и некоторые примеры того, какие проблемы могут возникать. Как и театр начинается с вешалки, сборка интерфейса всегда должна начинаться со сборки базовых элементов. Кнопки, задники окон, рамки предметов и т.п. Что считать базовым элементом зависит от конкретного интерфейса.
Кнопка как базовый элемент будет использоваться по всему интерфейсу, поэтому полезно сначала собрать типовые кнопки с нужными размерами шрифтов и т.п. Важно: в работе с префабами никогда не ленитесь писать названия, потом это сэкономит уйму времени при решении разных задач. Из-за того что это необязательно не стоит считать что это неважно.
Я собрал кнопку из кучи кружков, потому что на самом деле про интерфейс можно сказать так: «Дайте мне один кружок и на нём можно собрать очень много вариантов интерфейса». При этом это очень удобный концепт, так как весить такой интерфейс будет примерно ничего. В дальнейшем кроме каких-то иконок все базовые панели мы так же соберём с помощью одного спрайта-кружка. Вот пример вариантов кнопок:
Теперь соберём по аналогичному принципу фон для окна.
В данном случае у них есть некоторый “общий элемент” bg-circle-shadow. Его конечно же можно вынести в отдельную компоненту, чтобы пакетно красить тени, менять их реализацию и т.п. Но по опыту в разных сущностях лучше не обобщать такие элементы, так как именно из-за этого потом возникают проблемы “я поменял кнопку, а сломались все окна”. Изменение префабов с помощью инструментов Unity — слишком простое действие. Но тем не менее не хочется терять возможность пакетной обработки. Поэтому лучше заранее продумать контракты названий и манипулировать пакетно либо скриптами, либо в ручную, но осознанно меняя в определённых местах. Такие вещи на самом деле не так сложно читать на ревью в мерж реквестах, когда названия совпадают или имеют нечто общее. Так что разбор всего уж совсем на молекулы – это, как и в коде, излишняя декомпозиция, которая ведёт в будущем к неочевидным проблемам. Сущности должны быть разделены логически. И совсем базовые компоненты не должны пересекаться. Ну почти, но мы этого коснёмся чуть позже.
Из базовых элементов мы собрали всё, кроме “игрового предмета”.
Он аналогичен. Так сказать из того, что можно собрать на стоках, собрали для иллюстрации. Перед тем как начать собирать окна, немного ещё по базовым элементам. Базовые элементы интерфейса – это не эффекты или какие-то поведения на мой взгляд, чтобы с ними было удобно работать, а конкретные базовые сущности. Фоны, кнопки, прогресс бары для интерфейса. Персонажи, мечи, игровые объекты – которые могут повторяться и удобно редактировать пакетом. Основной плюс сборки сразу такого UI кита заключается в том, что дальше окна уже собираются довольно быстро, так как по сути это копирование и изменение значений, но основные ингредиенты окна уже собраны. Итак, начнём собирать окна.
Композиция или Nested Prefabs
Перед сборкой стоит рассказать про композицию и Nested Prefabs. В самой сборке нет ничего особо интересного, она скорее представлена для иллюстрации концепта. Префабы как сущность в движке обладают одной проблемой. Из-за того, как просто ими манипулировать, собирать и управлять, то многие очень халатно подходят к сборке и не учитывают насколько это важный элемент, который при правильном структурировании и аккуратной работе с ним может сэкономить в будущем уйму времени. По сути в Unity сейчас есть два механизма для работы с префабами композиция (Nested Prefabs) и наследование (Prefab Variance) и относится к ним нужно так же, как и к тем же механизмам в коде. Только с ещё с большей осторожностью, так как в префабах в принципе нет “защиты от дурака” Префаб просто позволяет определять View и делать биндинги без кода, но это всё ещё View. И всё ещё те же механизмы встречающиеся в разработке и их проблемы.
С композицией всё довольно просто. Она не всегда удобна, излишняя композиция ведёт к проблемам которые я описывал для базовых элементов и теней. То есть любой объект должен быть разбит на логические сущности. Если что-то присуще только этому окну – нет смысла выносить это в отдельный префаб. Самый простой способ определить это задать себе вопрос. Если я изменю этот элемент мне придётся менять это окно? Как можно заметить в базовых элементах у нас скажем не было заголовков окон. Если у окон нет некоей обобщённой вёрстки, то чаще всего мы не может рассуждать так:
“Итак, у нас есть заголовки. Хорошим тоном при работе шрифтов, что по всему приложению у нас есть несколько размеров шрифта и для заголовочных он свой. Поэтому вынесем это в префаб, чтобы менять размер шрифта по всему приложению для заголовков”
Идея, имеет место быть. Но в среднем по опыту такой подход ведёт к тому, что разработка узнаёт от тестеров о том, что “а вот тут сломался такой то экран, текст теперь залезает туда”. И это и есть излишняя декомпозиция. Всё зависит от конкретного случая, иногда окна скажем можно разбить на повторяющиеся виджеты, которые просто складываются друг на друга через horizontal layout, если дизайн такие молодцы и так сделали. Но это скорее исключение чем правило.
Соберём из наших компонент префаб окна награды за квест (я бы конечно ещё поиграл со шрифтами и хедером, но это только для статьи так что попрёт)
Получается такая композиция базовых элементов. Удобно, что если скажем у нас дизайн решит что кнопки подтверждения теперь должны быть оранжевыми их можно поменять везде через префаб, а если только в окне квестов, то зайти в префаб окна квеста и поменять там. При этом хочется обратить внимание на несколько моментов, которые я так же считаю весьма удобными.
Первое – это добавление в конец названий префаба предполагаемого действия. Это полезно в поиске, в авто-редактировании, в групповом редактировании объектов по принципу их действия и т.п. Тут можно завести удобный для себя контракт.
Второе – я специально на скриншотах захватываю весь экран, так как организация папок это важно. Не именно такая, каждому можно быть удобно своё в зависимости от контекста проекта. Но когда хорошая вложенность папок и всё логически разделено + панели отдельно от базовых элементов – это сильно упрощает навигацию в дальнейшем. Так же, как и смена стиля написания названий панелей (слонов) и базовых элементов (мелкими через дефис)
Третье – тут это не так хорошо видно, но организация папок с текстурами. Unity sprite atlas позволяет передавать папку в качестве параметра с текстурами. Поэтому если какие-то текстуры принадлежат какому-то игровому экрану, то лучше класть их в отдельную подпапку. Перед релизом игры может встать задача оптимизации интерфейсов. И тогда это так же сэкономит кучу времени, так как допустим одна из оптимизаций – это сгруппировать текстурные атласы по игровым экранам, чтобы уменьшить число draw call на интерфейс. Так как для того, чтобы интерфейс рисовался в скажем 1 dc одно из требований, чтобы все спрайты этого интерфейса лежали в одном атласе. Я в примере буду во всех экранах использовать одни и те же текстуры, так что у меня этого разделения нет.
Наследование или Prefab Variants
По своей сути же Prefab Variants – это наследование в префабах, которое позволяет расширять функционал наследников со всеми из этого вытекающими. Как базовая рекомендация в таком случае – не делать очень глубокую иерархию наследования. Если относится к префабам, как к коду, где всё довольно просто, чётко и иерархически, то все советы выполняются сами собой. Просто многие обращают на это недостаточно внимания и тратят уйму времени на поддержку подобных решений.
Соберём теперь окно для магазина:
И вот у нас уже появились префаб варианты. Они пока не обязательные на самом деле, скорее для иллюстрации концепции. Если бы в награде квеста у нас скажем была статичная иконка, а в магазине она периодически мигала или по ней проходил бы блик, чтобы привлекать внимание.
Важно: для окна квеста мы создали новый вариант game-item-quest-reward и он унаследован от game-item, так же как и game-item-shop унаследован от game-item. Очень частая ошибка, что если делается первым скажем окно QuestPanel, то там остаётся базовый game-item, или получается цепочка наследования game-item->game-item-quest-reward->game-item-shop, что в свою очередь очень плохо с точки зрения проектировки. Так как игровой предмет магазина по логике не должен зависеть от предмета в окне награды за квест. Они могут опираться оба на один базовый, но ни в коем случае нельзя строить такую зависимость. Хотя интерфейс Unity к этому подталкивает.
И вот у нас появились префаб варианты. Вариант красной кнопки – это удобно, но не обязательно. Просто верстая много окон или собирая их под разные аспекты в адаптивной вёрстке, очень часто нужно использовать кнопки разных цветов. И поэтому чем каждый раз красить зелёную удобнее просто сделать вариант. По сути это отдельный логический объект (именно визуальный), так как это кнопка отмены. Для кнопки которая во всём интерфейсе встречается один раз я бы не стал делать отдельный вариант, а это достаточно типовое разделение.
Ещё стоит обратить внимание, что структурно фон карточки сейчас – это тот же фон окна. Но тогда почему это отдельный префаб? Потому что это отдельная логическая сущность никак не связанная с фоном окна, и не должна изменяться вместе с изменением фона окна. А почему это не вариант, как сделано с игровым предметом? Так можно сделать, тут уже вопрос к тому насколько вы считаете эти сущности разными. Я считаю это рискованным при горизонтальном масштабировании, так как когда таких сущностей не 2-3, а 20-30 трудно следить за их изменениями. А при этом для пакетной обработки можно пройтись по ним скриптом, либо руками.
В заключении
Надеюсь данные советы и рекомендации сделают ваш проект лучше и будут полезны. Я лишь обращаю внимание на то, что не стоит к префабам относится халатно, так как изначально хорошо организованная структура экономит уйму времени при разработке проекта в дальнейшем.
В разработке, и префабы не исключение, есть базовый конфликт. С одной стороны хочется, чтобы правки меняли только тот модуль, который исправляется. Это упрощает разработку и не вызывает неочевидных багов, когда правка касается только конкретного модуля. А с другой стороны хочется удобства, чтобы из-за “дублирования” не приходилось одно и тоже при ошибке менять в каждом месте всей системе. И любая разработка – это компромисс между этими двумя стульями.
В общем резюмируя:
Следите за названиями объектов
Не делайте слишком глубокую иерархию вариантов и разделяйте их логически
Для базовых элементов, виджетов собираемых в окно лучше использовать Nested Prefabs и композицию
Не обманывайтесь интерфейсом и простотой редактирования. За префабами надо следить не меньше чем за кодом
Собранные префабы вы найдёте в этом репозитории, где можно посмотреть на организацию. Спасибо за внимание!
Editing a Prefab in Prefab Mode
To edit a Prefab An asset type that allows you to store a GameObject complete with components and properties. The prefab acts as a template from which you can create new object instances in the scene. More info
See in Glossary Asset, open it in Prefab Mode. Prefab Mode allows you to view and edit the contents of the Prefab Asset separately from any other GameObjects The fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject’s functionality is defined by the Components attached to it. More info
See in Glossary in your Scene A Scene contains the environments and menus of your game. Think of each unique Scene file as a unique level. In each Scene, you place your environments, obstacles, and decorations, essentially designing and building your game in pieces. More info
See in Glossary . Changes that you make in Prefab Mode affect all instances of that Prefab.
Entering and exiting Prefab Mode
You can edit a Prefab Asset in isolation, or in context.
In isolation: When you edit a Prefab in isolation, Unity hides the rest of your current working Scene, and you only see the GameObjects that relate to the Prefab itself (plus, optionally, a pre-set editing environment — see below).
In context: When you edit a Prefab in context, the rest of your current working Scene remains visible, but locked for editing.
Editing in isolation
You can begin to edit a Prefab in Prefab Mode in several ways. To open a Prefab Asset and edit it in isolation you can do it in the following ways:
- Double-click the Prefab Asset in the Project window
- Select a Prefab Asset in the Project window A window that shows the contents of your Assets folder (Project tab) More info
See in Glossary and click the Open Prefab button in the Inspector A Unity window that displays information about the currently selected GameObject, asset or project settings, allowing you to inspect and edit the values. More info
See in Glossary window
When you enter Prefab Mode in isolation, Unity only shows the contents of that Prefab in the Scene view An interactive view into the world you are creating. You use the Scene View to select and position scenery, characters, cameras, lights, and all other types of Game Object. More info
See in Glossary and the Hierarchy window. In the following image, the root of the Prefab is a regular GameObject — it doesn’t have the blue Prefab instance icon.
The Scene view and Hierarchy, with Prefab Mode in isolation
In Prefab Mode, the Scene view displays a breadcrumb bar at the top. The rightmost entry is the currently open Prefab. Use the breadcrumb bar to navigate back to the main Scenes or other Prefab Assets that you might have opened.
The breadcrumb bar at the top of the Scene view, visible when in Prefab Mode
The Hierarchy window displays a Prefab header bar at the top which shows the currently open Prefab. You can use the back arrow in the header bar to navigate back one step, which is equivalent to clicking the previous breadcrumb in the breadcrumb bar in the Scene view.
The back arrow in the header bar of the Hierarchy window, visible when in Prefab Mode
Editing in context
Alternatively, you can open a Prefab Asset in Context via an instance of that Prefab. Ways of doing that include:
- Select a Prefab instance in the Hierarchy window and click the Open button in the Inspector window
- Select a Prefab instance in the Hierarchy window and press P on the keyboard. This is the default keyboard binding
- Use the arrow button next to the Prefab instance in the Hierarchy window
By default, Unity displays the visual representation of the context in gray scale to visually distinguish it from the Prefab contents you edit. However, you can use the Context: control in the Prefab bar to set it to any of the following states:
- Normal — Shows the context with its normal colors
- Gray — Shows the context in gray scale
- Hidden — Hides the context entirely so only the Prefab content is visible
You cannot select the GameObjects that are part of the context, nor do they show in the Hierarchy. This is so you can focus on editing your Prefab without accidentally selecting other unrelated GameObjects, and without having a cluttered Hierarchy window. However, when you move GameObjects around that are part of the Prefab contents, you can use the snapping features in Unity to snap to GameObjects in the context, provided the context is not set to Hidden.
In Prefab Mode in Context, Unity displays the Prefab contents at a position that matches that of the Prefab instance it was opened through. This means that you might preview the root Transform The Transform at the top of a hierarchy of Transforms. In a Prefab, the Root Transform is the topmost Transform in the Prefab. In an animated humanoid character, the Root Transform is a projection on the Y plane of the Body Transform and is computed at run time. At every frame, a change in the Root Transform is computed, and then this is applied to the GameObject to make it move. More info
See in Glossary of the Prefab contents with different position and rotation values than the Prefab Asset actually has.
You cannot edit these values in Prefab Mode in Context. If you need to edit them, you can either open the Prefab in isolation, or select the Prefab Asset in the Project window and edit the values in the Inspector.
Apart from the root Transform properties, you can also override other properties of a Prefab instance, which might drastically change its appearance compared to the Prefab Asset it’s an instance of. To preview these overridden values from the Prefab instance, while in Prefab Mode in Context enable the Show Overrides toggle in the Prefab bar. While this setting is enabled, any properties that ayou override on the Prefab instance are previewed the same way on the Prefab contexts and you cannot edit them. To edit those properties, disable the Show Overrides toggle again.
Auto Save
Prefab Mode has an Auto Save setting in the top right corner of the Scene view. When it is enabled, Unity automatically saves any changes that you make to a Prefab to the Prefab Asset. Auto Save is on by default.
The Auto Save toggle in the upper right corner of the Scene view in Prefab Mode
If you want to make changes without automatically saving those changes to the Preset Asset, disable the Auto Save checkbox. In this case, Unity asks you if you want to save unsaved changes or not when you exit Prefab Mode for the current Prefab. If editing a Prefab in Prefab Mode seems slow, turning off Auto Save might help.
Changing between isolation or in context mode
When you open Prefab Mode via a Prefab Asset, Unity displays the contents of the Prefab in isolation. However, when you open Prefab Mode via a Prefab instance in the Hierarchy window, this opens Prefab Mode in Context.
When you open Prefab Mode this way, you can see the context of the Prefab instance in the Scene view even though you are not editing the instance but rather the Prefab Asset itself. For example, if you open Prefab Mode in Context via a Prefab instance in a Scene, then you can see the surroundings in that Scene while you edit the Prefab. The Prefab is also shown with the same lighting conditions as in the Scene.
A Prefab opened in Prefab Mode in Context, with the surrounding context displayed in gray scale
If you have a Prefab instance that you do not want to open in context, but want to open in isolation, hold down the Alt key and click the Open button or the arrow button to open Prefab Mode. You can also set up a custom shortcut in the Shortcuts window for the command Stage > Edit Prefab in Isolation.
When you make changes to a Prefab Asset while in Prefab Mode, you can only undo those changes while still in Prefab Mode. Once you exit Prefab Mode for a given Prefab Asset, your edits relating to that Prefab Asset are no longer available in the undo history.
Editing Environment
You can assign a Scene as an editing environment to be used with Prefab Mode in Isolation. This allows you to edit your Prefab against a backdrop of your choosing rather than an empty Scene. This can be useful to see how your Prefab looks against a specific scenery of your choice. Unity only uses this editing environment when you open Prefab Mode in Isolation.
You cannot select the GameObjects in the Scene that you assign as the editing environment when in Prefab Mode, nor do they show in the Hierarchy. This is so you can focus on editing your Prefab without accidentally selecting other unrelated GameObjects, and without having a cluttered Hierarchy window.
To set a Scene as the editing environment, open the Editor window (top menu: Edit > Project Settings, then select the Editor category) and go to the Prefab Editing Environment section. Use the Regular Environment setting for “non-UI” Prefabs, and the UI Environment setting for UI Prefabs. UI Prefabs are those which have a Rect Transform component on the root, rather than a regular Transform component. “non-UI” Prefabs are those which have a regular Transform component.
Prefab editing environment settings in the Editor Project Settings
Префаб
Префаб (prefab) — это шаблон для объекта в игровом движке Unity. С помощью префабов можно создать «образец» предмета с определенными свойствами, а потом использовать такие предметы на всей игровой сцене. Если изменить префаб, то изменятся все объекты, созданные на его основе.
В префабе хранится какой-либо объект со всеми свойствами и характеристиками. В движке всегда можно создать один или несколько «элементов», унаследованных от префаба, и модифицировать их.
Название происходит от метода строительства каркасных домов и означает сборку чего-то, как в конструкторе. Префабы можно группировать и комбинировать, поэтому процесс создания предметов с ними действительно напоминает конструктор.
Шаблоны в Unity называются ассетами (assets), поэтому иногда можно услышать определение, что префаб — это ассет для игрового объекта. Оно тоже верное.
Кто пользуется префабами и для чего они нужны
Префабами активно пользуются геймдев-разработчики на Unity. Они намного удобнее, чем простое «размножение» объектов копипастом. Ведь все объекты префаба наследуются от шаблона, поэтому, если понадобится изменить что-то в них всех, достаточно видоизменить сам префаб. А еще это позволяет легко создавать похожие друг на друга объекты, например толпу неигровых персонажей или какие-то шаблонные элементы ландшафта.
- для структурирования и оптимизации процесса разработки;
- для облегчения работы в команде — так проще распределять и координировать задачи;
- для гибкого создания похожих друг на друга, но при этом уникальных элементов;
- для легкого изменения свойств или поведения всех объектов разом — например, в игровом городе наступает ночь и окна в домах начинают светиться;
- для создания четкой и понятной иерархии объектов благодаря возможности группировать и вкладывать префабы друг в друга.
Как работают префабы
Игровое поле называется сценой. На ней расставлены объекты — предметы, у каждого из которых свой дизайн, функции и характеристики. Неигровой персонаж — это объект, тарелка на столе и сам стол — тоже. Игрок может так или иначе взаимодействовать с объектами, или они могут видоизменяться в зависимости от происходящего в игре. Некоторые из них декоративные, другие сюжетно важны.
В Unity объект хранится в сущности под названием GameObject. У нее есть компоненты, значения которых можно изменять, и разнообразные настройки.
Префаб — это GameObject, сохраненный в виде ассета. В нем хранится объект со всеми свойствами. На основе префаба можно создавать уже вполне конкретные экземпляры этого объекта и размещать их в сцене. Каждый из них будет потомком префаба и останется связан с ним, поэтому, если изменить префаб, изменения применятся ко всем его потомкам.
Отличие от ассета
В Unity также есть понятие файлового ассета — это файл, в котором хранится шаблон для чего-либо, в том числе для объекта, текстуры или чего-то еще. Если изменить ассет, изменения точно так же применятся ко всем объектам, которые им пользуются. Их обычно не создают «изнутри» движка, а импортируют извне: из визуальных, звуковых и 3D-редакторов.
Файловый ассет и префаб — похожие понятия, но не идентичные. У них разная функциональность и свойства: например, к ассету нельзя добавлять компоненты. Префабы используют для создания непосредственно GameObject и его свойств, а ассеты — более широкое понятие: они могут включать в себя изображения, текстуры, звуки, трехмерные модели и другие файлы. С их помощью можно добавлять что угодно, что может использоваться в игре, — если Unity поддерживает соответствующий формат.
Как создавать префабы
Префабы создаются в редакторе движка Unity — в нем происходит большая часть работы со сценой. Нужно выбрать в меню редактора пункт Asset -> Create Prefab, и создастся «пустой» префаб. В него можно перетащить любой объект со сцены — и этот объект станет префабом, «шаблоном». В нем сохранятся не только свойства, но и вложенные объекты — они тоже сделаются частью шаблона. Объект, из которого вы создали префаб, станет его экземпляром и останется на сцене, а не исчезнет.
Когда префаб готов, его экземпляры можно создавать буквально одним кликом. Нужно нажать на нужный префаб в окне проекта и перетащить на сцену. Если необходимо, экземпляры префаба можно генерировать с помощью кода.
Названия экземпляров префаба на сцене подсвечиваются синим, а имена обычных объектов — черные. Так их можно различать.
Как редактировать префабы
Через окно проекта. Префабы отображаются в боковом окне, где показана структура проекта. Там для них можно создавать отдельные папки. Рекомендуется хранить префабы в отдельной папке и в ее подпапках, чтобы не запутаться в собственных объектах.
Окно проекта можно использовать для редактирования префаба. Для этого надо дважды кликнуть на его имя или нажать на стрелку рядом с названием. После этого откроется редактор изменения шаблона — там можно менять свойства и компоненты, и результаты будут применены ко всем экземплярам.
Через экземпляры. Также префаб можно отредактировать через его экземпляры. В меню экземпляра префаба есть следующие кнопки:
- Select — выделяет префаб, от которого унаследован объект. Позволяет не искать нужный шаблон в списке, что удобно, если префабов много;
- Revert — «откатывает» изменения, сделанные в конкретном экземпляре, до стандартных параметров префаба;
- Apply — применяет изменения, сделанные в конкретном объекте, ко всему префабу. Соответственно, изменяются все экземпляры.
Как заменять префабы
Префаб можно заменить, если перетащить в окно его редактирования другой объект. Например, в префабе хранился объект ложки. Если перетащить в его редактор объект вилки, он перезапишет предыдущий, и все ложки на сцене станут вилками.
С этой функцией стоит быть осторожнее: если в объектах возникнет конфликт имен, замена может пройти с ошибкой. Такое может произойти, например, если внутри объектов есть дочерние элементы с одинаковыми именами.
Как редактировать экземпляр префаба
Есть обратная задача: разработчику может понадобиться отредактировать отдельный экземпляр префаба, не внося при этом изменения в сам шаблон. То есть элемент изменится относительно стандартного префаба, но тот останется неизменным. Так тоже можно сделать.
Понадобится зайти в настройки объекта и переопределить свойства, которые вам нужны, но не трогать при этом редактор самого префаба. Просто не заходите в соответствующее меню.
Для отдельного объекта можно:
- добавить или удалить компонент;
- изменить значение какого-либо свойства;
- добавить дочерний объект.
Удалять имеющиеся дочерние объекты, которые входят в начальный шаблон, нельзя, равно как и переопределять «родителя» для экземпляров префаба. Но дочерние элементы можно отключать — обычно этого достаточно.
Группировка префабов
Удобное свойство префабов — их можно группировать и вкладывать друг в друга. Дочерним элементом префаба можно сделать другой префаб. В результате проект легко масштабируется, а для объектов создается удобная иерархия.
Например, можно создать префаб для НПС, неигрового персонажа. А после этого создать префаб для толпы, состоящий из целой группы разных НПС. Таким же образом можно создавать окружающую сцену и объекты вокруг: сначала двери и окна, потом дом, в который они входят, потом участок с несколькими домами.
Это полезно, потому что делает структуру проекта более детальной и логичной. К тому же такой подход облегчает работу в команде: одному человеку можно «отдать» мелкие детали, второму — крупные, а потом все без лишних сложностей «соберут» в один большой префаб.
Как начать пользоваться префабами
Префабы — важный и часто используемый инструмент создания сцены в Unity. Ими начинают пользоваться вскоре после начала изучения движка. Но перед тем как переходить к проектам на Unity, понадобится разобраться с языком программирования C#, на который ориентирован движок, и с основными принципами разработки игр. Хотя начинать тренироваться с движком можно параллельно с изучением языка программирования — так вы сразу будете узнавать и теорию, и практику.
Узнайте все нужные технологии для старта в геймдеве на наших курсах. Программу ведут профессионалы, которые обучат вас актуальным технологиям и практикам.
Префабы (Prefabs)
Довольно удобно работать с GameObject в сцене, добавляя компоненты и изменяя их значения на нужные вам в инспекторе. Однако, это может создать ряд проблем в таких случаях, когда вы работаете над созданием NPC, объектом или предметом, который многократно встречается в сцене. Вы, конечно, можете просто скопировать эти объекты для создания дубликатов, но все они будут редактироваться независимо друг от друга. Обычно вы желаете, чтобы все экземпляры отдельно взятого объекта имели одинаковые значения свойств, чтобы при редактировании одного такого объекта в сцене вам не пришлось повторно вносить те же изменения и во все остальные копии.
К счастью, в Unity можно создавать префабы . Это особый тип ассетов, позволяющий хранить весь GameObject со всеми компонентами и значениями свойств. Префаб выступает в роли шаблона для создания экземпляров хранимого объекта в сцене. Любые изменения в префабе немедленно отражаются и на всех его экземплярах, при этом вы можете переопределять компоненты и настройки для каждого экземпляра в отдельности.
Важно: Когда вы перетаскиваете файловый ассет (например, меш) в сцену, будет создан новый экземпляр такого объекта и все такие экземпляры изменятся при изменении оригинального ассета. Однако, хоть его поведение и похоже, но ассет — это не префаб, так что у вас не выйдет добавить к нему компоненты или использовать любые другие описанные ниже свойства префабов.
Использование префабов
Вы можете создать префаб, выбрав Asset > Create Prefab и перетащив объект со сцены в “пустой” префаб, появившийся в проекте. После чего можно создавать экземпляры префаба просто перетаскивая его из окна Project на сцену. Имена объектов-экземпляров префабы, будут подсвечиваться синим в окне Hierarchy (имена обычных объектов имеют чёрный цвет).
Как уже упоминалось выше, изменения в префабе автоматически применятся ко всем её экземплярам, однако вы можете изменять и отдельные экземпляры. Это полезно например в случае, когда вы желаете создать несколько похожих NPC, но с внешними различиями, чтобы добавить реалистичности. Чтобы было чётко видно, что свойство в экземпляре префаба изменено, оно показывается в инспекторе жирным шрифтом (если к экземпляру префаба добавлен совершенно новый компонент, то все его свойства будут написаны жирным шрифтом).
Mesh Renderer на экземпляре префаба с переопределённым свойством “Cast Shadows”
Также, вы можете создавать экземпляры префабов из кода во время выполнения приложения. Прочтите страницу руководства про создание экземпляров префабов для дополнительной информации.
Редактирование префаба из его экземпляров
Инспектор экземпляра префаба содержит три кнопки, которые у обычных объектов отсутствуют: Select (Выделить), Revert (Отменить) и Apply (Применить).
Кнопка Select выделяет файл префаба, из которого был получен данный экземпляр. Это позволяет быстро найти и отредактировать оригинальный префаб, применяя изменения ко всем его экземплярам. Однако, вы также можете сохранить переопределённые свойства из экземпляра в сам оригинальный префаб с помощью кнопки Apply (изменённые значения положения и вращения трансформации не применяются по очевидным причинам). Это позволяет эффективно редактировать все экземпляры через любой из них, и это быстрый и правильный способ вносить глобальные изменения. Если вы экспериментируете с переопределением свойств, но в итоге решаете, что изначальные свойства (заданные в префабе) для вас предпочтительнее, то вы можете отменить все сделанные переопределения с помощью кнопки Revert, вернув экземпляр в изначальное состояние.