YAML сериялизации префабы
Unity представляет экземпляры префаб, вложенные варианты префабы и префаб в сериализованных сценах (.unity) и файлах префаб (.prefab), используя небольшой набор связанных элементов YAML. На этой странице описаны эти элементы и как они сочетаются.
Понимание этого формата полезно при разрешении конфликтов слияния в файлах префаб вручную, проверке файлов, созданных автоматической сборкой, или работе с ресурсами Unity из скриптов, выполняемых вне Редактора.
Общая информация о Unity формат серийного номера, см. Формат текстовых серийных файлов и UnityYAMLВместо аннотированного текста YAML примеры из префаб файлы, см. Пример YAML префаб сериализация.
Префаб элементы сериализации
Unity представляет собой ссылку на префаб внутри сцены или другой файл префаб, используя четыре связанных элемента:
- A PrefabInstance Элемент YAML, который ссылается на исходный ассет префаба и хранит набор переопределений.
- Ан m_Modification блок внутри
PrefabInstanceэлемент, регистрирующий индивидуальные изменения собственности и объекты, добавленные или удаленные по отношению к источнику префаб. - Объекты замены, которые позволяют другим объектам в том же файле ссылаться на конкретные объекты внутри экземпляра префаб (например, дочерний объект
Transform). - Ассет префаб управляет в исходном ассете префаб. Его fileID всегда является
100100000, и объектыPrefabInstanceссылаются на него через свойствоm_SourcePrefab.
Информацию о том, как эти элементы расположены в файлах вариантов префаб, см. в вариантах Префаб.
Элемент PrefabInstance
Unity представляет экземпляр префаба как документ YAML с идентификатором класса 1001 и тип документа PrefabInstance:
--- !u!1001 &<fileID>
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
...
m_SourcePrefab: {fileID: 100100000, guid: <prefab-guid>, type: 3}
Ключевые свойства:
m_Modification: блок данных, который записывает все, что отличается между этим экземпляром и источником префаб. Более подробную информацию см. в Блок m_Modification.m_SourcePrefab: межфайловая ссылка на исходный ресурс префаб. fileID всегда является100100000(обработчик ресурса префаб), так что только значениеguidменяется между ссылками. Дополнительную информацию см. в Обработчик ресурса префаб.
Полный пример экземпляра префаб в сцене см. в экземпляре Префаб в сцене.
Блок m_Modification
Блок m_Modification хранит данные, которые отличаются между экземпляром и источником префаб, включая переопределения свойств и любые объекты, которые добавляются или удаляются. Он содержит следующие поля:
| Полевая | Описание |
|---|---|
m_TransformParent |
Ссылка на родительский компонент Transform этого экземпляра в содержащем файле. {fileID: 0} означает, что экземпляр не имеет родителя, что является характерной особенностью вариантов префаб, поскольку экземпляр является корнем файла варианта. |
m_Modifications |
Массив записей переопределений свойств. Каждая запись указывает на объект в исходном префабе и хранит новое значение одного свойства. Дополнительные сведения см. в Изменения в свойстве. |
m_RemovedComponents |
Компоненты из источника префаб, удаленные в этом экземпляре. |
m_RemovedGameObjects |
GameObjects из источника префаб, которые удаляются в этом экземпляре. |
m_AddedGameObjects |
GameObjects добавлен к этому экземпляру, который не существует в источнике префаб. |
m_AddedComponents |
Компоненты добавлены к этому экземпляру, которые не существуют в источнике префаб. |
Unity записывает пустые списки для любого из этих полей, даже если в них нет записей. Чистый экземпляр префаб без переопределений все равно содержит m_Modifications: [], m_RemovedComponents: []и так далее.
Примечание: m_Modification (единственное число) — имя блока. m_Modifications (во множественном числе) — имя массива переопределений свойств внутри блока. Эти два имени различаются одной буквой.
Изменения в свойстве
Каждая запись в массиве m_Modifications имеет четыре поля:
| Полевая | Описание |
|---|---|
target |
Кросс-файловая ссылка на объект внутри источника префаб, свойство которого переопределяет эта запись. guid соответствует источнику префаб. |
propertyPath |
Путь к перезаписываемому свойству. Соответствует SerializedProperty.propertyPath. Пути с точками, например m_LocalPosition.x, описывают подсвойства. |
value |
Переопределяющее значение, сохранённое в виде строки. Для переопределений-ссылок на объекты оно пустое. |
objectReference |
Ссылка на другой объект, если переопределяющее значение является ссылкой. {fileID: 0} когда переопределение не является ссылкой на объект. |
Обычное переопределение свойства использует value поле:
- target: {fileID: 599465214307944399, guid: 95cf80858ee0c4940b72f62b17aefd41, type: 3}
propertyPath: m_LocalPosition.x
value: 39.341
objectReference: {fileID: 0}
Переопределение ссылки на объект использует objectReference вместо этого, с пустым value поле:
- target: {fileID: 1773024279374141337, guid: 89d4c08db6b9096438cb6c7718d47f26, type: 3}
propertyPath: m_Material
value:
objectReference: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
Дополнительные сведения о формате {fileID, guid, type} в ссылках см. в разделе Управление ассетами прямой ссылки.
Изъятые объекты-заместители
Файл сцены или файл, содержащий префаб, может ссылаться на конкретные объекты внутри экземпляра префаб. Например, если корень экземпляра префаб является дочерним элементом элемента GameObject в сцене, то компонент Transform родительского GameObject содержит корень экземпляра префаб в массиве m_Children.
В этих случаях Unity не сериализирует объект ссылки непосредственно в сцену или содержащий префаб файл. Вместо этого, он добавляет стриптиз элемент замены для этого файла. Элемент замены содержит только информацию, необходимую для идентификации исходного объекта:
--- !u!4 &<fileID> stripped
Transform:
m_CorrespondingSourceObject: {fileID: <source-fileID>, guid: <source-guid>, type: 3}
m_PrefabInstance: {fileID: <PrefabInstance-fileID>}
m_PrefabAsset: {fileID: 0}
Ключевое слово stripped в заголовке документа указывает на то, что объект является заменой. Поля:
| Полевая | Описание |
|---|---|
m_CorrespondingSourceObject |
Кросс-файловая ссылка на соответствующий объект в исходном ассете префаб. |
m_PrefabInstance |
Локальная ссылка на элемент PrefabInstance в текущем файле, к которому принадлежит этот заполнитель. |
m_PrefabAsset |
Имеет значение {fileID: 0} в сценах и содержит префабы. Это поле устанавливается только тогда, когда объект сам является частью ассета префаб на диске. |
Обозначение ассета префаб
Когда Unity импортирует ассет .prefab, он создает специальный объект под названием префаб asset handle с fileID 100100000. Обращение не появляется как документ YAML в исходном файле .prefab на диске. Оно генерируется во время импорта и хранится в серийном артефакте префаб в папке Library.
Ручка является объектом ссылки m_SourcePrefab на PrefabInstance:
m_SourcePrefab: {fileID: 100100000, guid: 95cf80858ee0c4940b72f62b17aefd41, type: 3}
Поскольку fileID 100100000 является постоянным для каждого префаб, только guid меняется между ссылками на различные префабы. type: 3 указывает, что ссылка разрешается на импортированный артефакт в папке Library, а не на файл в папке Assets. Дополнительную информацию о значениях типов см. в Значения полей типов.
Варианты Префаб
Вариант префаб — это файл .prefab, наследующий от базового префаб.
На диске Unity представляет собой корень варианта префаб как PrefabInstance элемент (идентификатор класса 1001), а не в качестве отдельно серийного номера GameObject элемент. Внутри этого PrefabInstance, m_Modification.m_TransformParent поле имеет значение {fileID: 0}, потому что экземпляр не имеет родителя внутри файла. Таким образом Unity идентифицирует префаб как вариант.
Поле m_SourcePrefab ссылается на базу префаб, от которой наследуется вариант. Блок m_Modification записывает данные, уникальные для варианта, такие как переопределенные значения свойств, компоненты и добавленные или удаленные объекты, используя тот же формат, что и любой другой экземпляр префаб.
Аннотированный пример файла варианта см. в Префаб variant.