Что нового в префабах в версии 2022.2?

Давненько команда Scene Management не рассказывала об обновлениях в Prefabs. За последние несколько релизов, после исправления большого количества ошибок, о которых вы сообщали (спасибо!), мы внесли несколько улучшений в систему Prefab. Давайте рассмотрим каждое улучшение, которое появится в версии 2022.2, доступной сейчас в бета-версии, и как эти обновления могут принести вам пользу.
Теперь вы можете заменить Prefab Asset для экземпляра Prefab, который существует либо в сцене, либо вложен в другие Prefab. Эта функция сохранит положение, поворот и масштаб экземпляра Prefab в сцене, но объединит содержимое нового Prefab Asset, сохранив при этом как можно больше переопределений и ссылок с помощью сопоставления имен (по умолчанию). Более конкретно:
- В инспекторе для экземпляра Prefab появилось новое поле объекта, которое можно использовать для замены актива Prefab.
- Иерархия имеет контекстное меню, которое может аналогичным образом заменить готовый ассет экземпляра.
- Наконец, обычный объект GameObject можно преобразовать в экземпляр Prefab через контекстное меню в иерархии или перетаскиванием с помощью клавиши-модификатора Ctrl/Cmd.



Эта функциональность доступна не только в пользовательском интерфейсе, но, как и большинство создаваемых нами функций, она имеет API, позволяющий управлять сопоставлением объектов, а также тем, как должны обрабатываться переопределения. См. PrefabUtility.ReplacePrefabAssetOfPrefabInstanceи PrefabUtility.ConvertToPrefabInstance.
Одним из наиболее востребованных улучшений была возможность изменять порядок добавленных игровых объектов и компонентов. "Добавленные игровые объекты и компоненты" относится к игровым объектам и компонентам, которые не являются частью экземпляра префаба, но добавляются к экземпляру префаба в сцене или внутри варианта или вложенного префаба. Так, начиная с версии 2022.1, можно перетаскивать добавленные игровые объекты - как между собой, так и между игровыми объектами, принадлежащими экземпляру Prefab. Подготовка этой функции потребовала значительной переработки системы отмены.
Если вы хотите изменить порядок добавленных GameObject'ов из сценария редактора, просто установите индекс сиблингов в Transform добавленного GameObject'а. Возможность изменять порядок добавленных компонентов в Инспекторе появилась в версии 2022.2. Публичного API для переупорядочивания компонентов не существует.
Последнее, что нам было нужно для достижения полного равенства функций между GameObjects и компонентами, - это возможность удалять GameObjects из экземпляров Prefab в качестве переопределения. Удаление GameObjects как Overrides - опция, доступная в 2022.2, - гарантирует, что после удаления GameObject'а обычные процессы возврата к Prefab Asset'у/применения к нему будут работать так, как вы ожидаете.
Когда речь идет о скрипте редактора, используйте Object.DestroyImmediate для уничтожения объектов экземпляра Prefab и записи уничтожения как переопределения, сохраненного в файле сцены.
Пользователи часто спрашивают, как выглядит дерево наследования вариантов для конкретного актива Prefab Asset. В версии 2022.2 мы добавили всплывающее окно Prefab Family в Инспектор. Содержимое всплывающего окна зависит от выбранного актива Prefab Asset в обозревателе проектов. После выбора актива префаба и открытия всплывающего окна "Семья префаба" в редакторе отображаются все предки текущего префаба, а также все ближайшие дети.

Помимо вопросов о дереве наследования, пользователи часто спрашивают, как избавиться от неиспользуемых переопределений, которые хранятся в сцене, но к которым никогда не обращались (потому что свойство было удалено из сценария). В худшем случае такие свойства могут ссылаться на активы, которые затем попадают в финальную сборку, занимая место на устройстве хранения и в памяти, но никогда не используются.
Переопределения теперь помечаются как неиспользуемые:
- Нулевые целевые объекты
- Неизвестные пути свойств (которые не подлежат сценарному использованию FormerlySerializedAsAttribute )
- Удаленные компоненты
- Удаленные игровые объекты
- Изменение размеров массива (например, массива материалов)
При выборе одного или нескольких экземпляров Prefab в иерархии и открытии выпадающего списка Overrides редактор теперь показывает, есть ли неиспользованные Overrides. Затем вы можете удалить их из сцены с помощью нового выпадающего списка "Неиспользуемые переопределения".

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

Мы не удаляем неиспользуемые переопределения автоматически. Ведь причину их существования невозможно предугадать. Удаление свойства из сценария или удаление актива не должно автоматически удалять неиспользуемые переопределения, поскольку впоследствии вы можете захотеть отменить удаление и восстановить переопределения.
Если вам интересно: "Почему после нажатия кнопки "Применить все" у меня все еще остаются переопределения на экземпляре Prefab?". Ответ заключается в том, что эти переопределения просто не могут быть применены к объекту Prefab Asset. Чаще всего такие переопределения представляют собой ссылки на другие объекты в сцене, на которые нельзя ссылаться из Prefab Asset. Переопределения, которые обычно не применяются, теперь выделяются темно-синей полосой в Инспекторе. Их нельзя применить, можно только отменить.
Теперь вы можете изменить поведение по умолчанию при открытии режима Prefab Mode на In Isolation вместо In Context. Перейдите в меню Параметры редактора > Общие > Режим префаба по умолчанию, чтобы внести это изменение.

Теперь, в версии 2022.2, отмена записывается как одна операция отмены при выходе из режима Prefab. Это приведет к тому, что все изменения, сделанные в префабе, будут отменены, если вы выполните отмену после выхода из режима префаба.
За несколько выпусков значительно улучшилась обработка ошибок и отчетность при загрузке сцены (и загрузке префабов в режиме префабов). Теперь в отчетах будет указано, с какими префабами связаны ошибки, и/или GUID для отсутствующих префабов. На самом деле, способ обработки отсутствующих активов Prefabs во время загрузки сцены стал безопаснее и стабильнее, чем раньше.
Чтобы еще больше улучшить обработку ошибок и избежать попадания плохих данных в ваш проект, мы добавили тип актива Broken Prefab Asset Type, который будет создаваться импортером префабов при возникновении ошибок, которые невозможно исправить.
Чаще всего вариант префаба теряет свой родительский префаб, возможно, из-за того, что он был удален. В этом случае мы не можем создать значимый вариант префаба, поэтому вместо него создается актив Broken Prefab Asset . Этот новый актив будет показывать информацию о том, что не так в Инспекторе, когда он выбран в Обозревателе проектов. Если это случай отсутствия родительского префаба, то будет показан GUID отсутствующего префаба. Также, если нарушена цепочка вариантов префабов, вы можете подниматься по цепочке через Инспектор, пока не найдете вариант с отсутствующим родителем.

Концепция отключенных экземпляров сборных конструкций больше не существует, начиная с версии 2022.1. Мы по-прежнему поддерживаем загрузку экземпляров Disconnected Prefab, но когда редактор сталкивается с ними во время загрузки сцены, экземпляры Disconnected Prefab лишаются всей своей информации о Prefab и становятся обычными игровыми объектами.
Как уже говорилось, наша команда исправила ряд ошибок, о которых вы любезно сообщили нам за прошедшее время. Некоторые из них берут свое начало в оригинальной системе Prefab, но многие стали очевидны только после появления наших улучшенных сборных конструкций.
Сегодня мы уверены, что вам понравится стабильность новейшей системы Prefab. Мы надеемся, что вы найдете его удобным и эффективным в работе.
У вас есть другие вопросы или комментарии по теме Сборные конструкции? Присоединяйтесь к нам на форумах, чтобы поделиться своими отзывами.
