Unity 6.3
0 онлайн 106 гостей 3 в системе
Вход
Сцены Шаг 46 из 48

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.

Дополнительные ресурсы