Перейти к основному содержимому

SerializeReference Tooling

Ссылки на переименованные и удалённые классы находятся по всему проекту и чинятся разом — раньше, чем в сборке они станут null.

Быстрый старт​

примечание

Двоичные ассеты и нескачанные файлы Git LFS молча пропускаются: оставьте Asset Serialization → Mode в Force Text (стоит по умолчанию) и скачайте файлы LFS до проверки.

Project References: восстановить группу​

Project References и Asset References — вкладки одного окна. Scan Project читает файлы .prefab, .asset и .unity под Assets/, кроме Excluded scan folders.

Project References с группами Fix all, Smart Fix → Pistol и Migrate allProject References с группами Fix all, Smart Fix → Pistol и Migrate all

Действия с группой​

ГруппаКнопка в заголовкеСтрока под заголовком
Потерянный типFix all ▼ — выбрать класс для всех записейSmart Fix → Pistol — применить класс с тем же или похожим именем; причина в подсказке
Переименование с [MovedFrom]Reassign all ▼ — выбрать другой класс вместо нового имениMigrate all → Crossbow — записать новое имя, см. Миграции

Каждое действие спрашивает подтверждение Rewrite. <None> в выборе класса очищает ссылки группы и удаляет их данные, включая поля с тем же rid; он спрашивает Clear и Undo не имеет.

Что сохраняется при восстановлении​

Восстановление переписывает только класс, пространство имён и сборку записи; её данные и rid остаются. Если поля группы разных типов, выбранный класс может подойти не всем: несовместимые записи станут null при переимпорте.

В сводке перезаписи есть Undo: он возвращает прежний класс записям, в которых всё ещё стоит новый. Undo пропадает после Rescan, закрытия окна и перезагрузки домена; Edit → Undo перезапись не отменяет.

Экземпляры префабов​

Потерянный класс, заданный через override экземпляра префаба, — в варианте, вложенном префабе или экземпляре в сцене, — показывается в отдельной карточке Prefab instance overrides.

Карточка Prefab instance overrides с потерянным GhostRailgun в варианте EliteLoadoutКарточка Prefab instance overrides с потерянным GhostRailgun в варианте EliteLoadout

Fix all, Smart Fix, Migrate all и <None> такие записи не переписывают: выберите новый класс на экземпляре в инспекторе или отмените override. В Asset References ссылки, которые есть только в override, не видны.

Asset References: разобрать один ассет​

Укажите сохранённый префаб, ScriptableObject или сцену в поле рядом с Rescan либо щёлкните строку записи в Project References.

Asset References: потерянный GhostCrossbow, общий Pistol с меткой SHARED и запись Railgun в OrphanedAsset References: потерянный GhostCrossbow, общий Pistol с меткой SHARED и запись Railgun в Orphaned

ОбозначениеЗначение
Полоса с Fix Missing ▼Сохранённый класс не найден; кнопка открывает выбор класса
Строка Smart Fix → PistolКласс, подобранный как у Smart Fix в Project References
Строка Migrate → Crossbow под полосой Fix ▼Класс переименован с [MovedFrom]: строка записывает новое имя, Fix ▼ выбирает другой класс
Полоса с Change ▼, Assign ▼ или Assign Required ▼Меняет класс исправной ссылки, заполняет пустое или обязательное поле; ассет сохраняется сразу
SHAREDНесколько полей указывают на один экземпляр; одинаковый цвет отмечает связанные поля
OrphanedЗапись, на которую не указывает ни одно поле; Clear удаляет её из файла, без Undo

Fix Missing, Smart Fix и Migrate записывают класс в файл сразу, без подтверждения, и Edit → Undo его не отменяет.

GhostWeapon восстанавливается как Pistol в Asset ReferencesGhostWeapon восстанавливается как Pistol в Asset References

Миграции с MovedFrom​

Если CrossbowLauncher переименован в Crossbow с [MovedFrom], Unity загружает старые ссылки сам. Migrate all записывает новое имя в файлы, чтобы атрибут можно было удалить:

В файле — до Migrate allПосле
type: {class: CrossbowLauncher, …}type: {class: Crossbow, …}

Группа становится ожидающей миграцией, только если старое имя указано в [MovedFrom] ровно у одного подходящего полю класса, а сохранённый класс — не закрытый generic; проверки сборки такую группу потерянной не считают.

Удаляйте [MovedFrom], только когда старое имя не осталось ни в одном файле. Migrate all не переписывает его:

  • в override экземпляров префабов;
  • в открытых, несохранённых и заблокированных файлах, см. ограничения;
  • в папках из Excluded scan folders;
  • в двоичных ассетах и нескачанных файлах Git LFS;
  • в файлах вне Assets/.

Проверка перед сборкой​

Строгость проверки задаёт настройка Build / CI gate:

РежимСборка плеераОтдельный CI-запуск
OffПроверка пропускаетсяНи поиска, ни отчёта, старый отчёт остаётся; код 0
WarnПредупреждение, сборка продолжаетсяОтчёт и нарушения в журнале; код 0
FailПотерянные типы прерывают сборкуОтчёт; код 1 при нарушениях

Сборка проверяет все ассеты под Assets/, а не только попадающие в неё: в режиме Fail её остановит и неиспользуемый префаб — исключите такие папки в Excluded scan folders.

Что проверяет каждый запуск​

ЗапускПотерянные типыПустые поля с Required = true
Project References → Scan ProjectДа, вместе с ожидающими миграциямиЕсли режим не Off, отдельной группой Required violations
Asset ReferencesДаДа, в любом режиме
Сборка плеераЕсли режим не OffНет
CI без -srGateRequiredЕсли режим не OffНет
CI с -srGateRequiredЕсли режим не OffЕсли режим не Off

Группа Required violations: пустое поле _primary в двух префабахГруппа Required violations: пустое поле _primary в двух префабах

Обязательное поле задаёт [TypeSelector(Required = true)], подробнее — в разделе Обязательное поле. В сценах у проверки Required есть ограничения.

Запуск в CI​

Unity -batchmode -projectPath . \
-executeMethod \
Aspid.FastTools.SerializeReferences.Editors.SerializeReferenceCiGate.RunCheck \
-srGateReport SerializeReferenceGateReport.txt \
-srGateRequired -srGateFail

Код выхода 2 означает сбой самой проверки.

Флаги запуска​

ФлагДействие
-srGateReport <path>Путь отчёта от корня проекта, по умолчанию SerializeReferenceGateReport.txt; папка должна существовать, файл перезаписывается
-srGateRequiredДополнительно проверить незаполненные поля с Required = true
-srGateFailИспользовать Fail вместо режима проекта, даже Off
-srGateWarnOnlyИспользовать Warn вместо режима проекта, даже Off; важнее -srGateFail, если переданы оба

Отчёт​

Отчёт начинается с заголовка:

# SerializeReference Gate Report
# Violations: 2
# Not scanned (not text YAML): 2
# Binary Assets/Legacy/OldLoadout.prefab
# LfsPointer Assets/Levels/Arena.unity

Пропущенные файлы не меняют код выхода.

Дальше — по строке на нарушение, поля разделены табуляцией:

KIND assetPath fileId rid className fieldPath origin
ПолеСодержимое
KINDMissingType или RequiredUnset
assetPathПуть файла
fileIdИдентификатор объекта-владельца внутри файла; для override экземпляра префаба — идентификатор экземпляра
ridИдентификатор managed-ссылки; в строках RequiredUnset — -2 для пустого [SerializeReference] и 0 для string и SerializableType
classNameСохранённое имя класса для MissingType
fieldPathПуть обязательного поля; для MissingType из override — переопределённое поле; иначе пусто
originoverride для типа, заданного override экземпляра префаба; иначе пусто

В Asset References запись находится по rid, строка RequiredUnset с rid 0 — по fieldPath; строка с origin override — в карточке Prefab instance overrides в Project References.

Настройки​

Все настройки собраны в Tools → Aspid 🐍 → FastTools → Settings; общие есть и в Project Settings → Aspid.FastTools → SerializeReference, личные — в Preferences → Aspid.FastTools → SerializeReference.

Раздел SerializeReference во вкладке SettingsРаздел SerializeReference во вкладке Settings

НастройкаПо умолчаниюЧто делает
Build / CI gateWarnЗадаёт строгость проверки перед сборкой и в CI
Excluded scan foldersНет папокПапки внутри Assets/, которых не касаются Project References, проверки сборки и CI и Breakage detection
Auto de-alias duplicated list elementsВключенаДаёт продублированному элементу списка собственный экземпляр вместо общего rid
Breakage detectionВключенаПосле изменения скриптов или ассетов сообщает о новых потерянных ссылках уведомлением и в Console

Breakage detection хранится локально в EditorPrefs, остальные настройки — в ProjectSettings/SerializeReferenceSharedSettings.asset, общем для команды и CI.

Ограничения​

ГдеОграничение
Открытые сцены, Prefab Mode, несохранённые и заблокированные файлыПерезапись их пропускает: сохраните и закройте файл или исправьте поле через Fix в инспекторе
Сцены и поля под потерянной родительской ссылкойAsset References меняет только потерянные типы
Required в сценахНе проверяются поля внутри managed-ссылок, в коллекциях и в override префабов

Пример в пакете​

Потерянные типы, переименование через [MovedFrom] и общая ссылка для обеих вкладок есть в ассетах примера SerializeReferences.