Обновление базы данных ассетов
Unity обновляет Базу Данных Ассетов в следующих ситуациях:
- Когда Unity Editor возвращается в фокус (если вы включили Auto-Refresh в окне Настройки)
- При выборе Assets > Refresh из меню.
- Когда вы вызываете
AssetDatabase.Refreshиз кода. Некоторые другиеAssetDatabaseAPIs вызывают обновление, но только для ассетов, которые вы указываете.
Обновить процесс
Unity выполняет следующие действия во время обновления базы данных ассетов:
- Проверьте, не были ли добавлены, изменены или удалены какие-либо файлы в папках
AssetsиPackagesсо времени последней проверки, и обновите Базу данных ассетов соответствующим образом. - Импорт и компиляция файлов, связанных с кодом, таких как .dll, .asmdef, .asmref, .rsp и .cs.
- Перезагрузить скриптовый доменесли Refresh не был вызван из скрипта.
- Последующая обработка всех ассетов для импортированных файлов, связанных с кодом.
- Импортировать ассеты, не связанные с кодом, и после обработки всех остальных импортированных ассетов.
- Горячая перезагрузка ассетов.
Перезапуск процесса обновления
Unity перезапускает процесс обновления базы данных ассетов, если:
- Импорт ассета не удалось.
- После импорта файл, использованный импортером, изменился на диске.
- В
OnPostProcessAllAssets, вы вызываете любое из следующих действий:ForceReserializeAssetsAssetImporter.SaveAndReimport- Любой
AssetDatabaseAPI, который входит в очередь дополнительного обновления, например MoveAsset, CreateAsset и ImportAsset.
- Время последнего изменения импортируемого файла меняется во время его импорта. Это может произойти, если вы начинаете извлекать файлы из системы управления версиями, когда Редактор находится в фокусе.
- Импортер создает файл в середине импорта. Например, модели FBX могут перезапустить обновление, извлекая текстуры из модели.
- Перезагрузка сборки происходит после компиляции скриптов. Если вы создаете файл C# во время процесса обновления, этот новый файл должен быть компилирован.
- Вы сохраняете ресурс как Текст только, но ресурс должен быть сериализирован в двоичном формате. Например, сцены с рельефами в них должны быть сериализированы в двоичном формате, поскольку данные рельефа будут громоздкими, если их просмотреть как массив символов в текстовом файле.
Отслеживание зависимостей
База данных ассетов отслеживает два типа зависимостей ассетов: static dependencies и динамические зависимости. Если какая-либо зависимость ассета изменяется, то Unity реимпортирует ассет.
Статические зависимости
Статическая зависимость — это значение, настройка или свойство, от которого зависит импортёр. Статические зависимости известны до импорта ассета и не зависят от поведения импортёра в ходе импорта. Если какая-либо статическая зависимость ассета меняется, Unity импортирует ассет заново.
Статические зависимости включают:
- Имя ассета.
- ID импортера, связанного с ассетом.
- Версия импортера.
- Выбранная в данный момент целевая платформа сборки.
Динамические зависимости
Динамические зависимости определяются содержимым исходного ассета и обычно обнаруживаются во время процесса импорта. Например, шейдер может ссылаться на другой шейдер, а префаб может зависеть от другого префабы.
Импортер может также использовать глобальное состояние в зависимости от содержимого исходного ассета — в этом случае оно тоже становится динамической зависимостью. Примеры: целевая платформа, цветовое пространство проекта, графический API, версия среды выполнения скриптов или состояние сжатия текстур.
Unity хранит динамические зависимости ассета в AssetImportContext.
Импорт и компиляция файлов, связанных с кодом
В списке изменённых или добавленных файлов Unity собирает те, которые относятся к коду, и отправляет их в конвейер компиляции скриптов. Компилятор генерирует сборки из файлов скриптов и файлов определения сборок в вашем проекте. Более подробную информацию об этом шаге см. в Организация скриптов в сборки.
Импорт ассетов, не связанных с кодом
Импортер каждого ассета обрабатывает этот тип ассета и идентифицирует файлы для импорта на основе расширений файлов. Например, TextureImporter отвечает за импорт .jpg, .png и .psd файлов, среди прочих.
Существуют две категории импортеров:
- Нативные импортеры: встроенные в Unity импортеры.
- Скриптовые импортеры: Пользовательские импортеры, которые расширяют возможности импорта Unity. Они написаны на C#.
Unity обрабатывает сначала все импортеры, а затем все импортеры, созданные с помощью сценариев, в отдельной фазе.
Предварительная обработка и последующая обработка
AssetPostprocessor класс предоставляет набор обратных вызовов, позволяющих выполнять работу до импорта (предобработка) и после него (постобработка) для разных типов ассетов. Подробности об этих обратных вызовах и примеры использования см. в AssetPostprocessor Ссылка API.
Горячая перезагрузка
Горячая перезагрузка — это процесс применения изменений к скриптам и ресурсам, пока Редактор открыт. Это может произойти, когда Редактор находится в режиме воспроизведения или режиме редактирования, и не требует перезапуска Редактора для вступления изменений в силу.
Когда вы изменяете и сохраняете скрипт, Unity перезагружает все данные скрипта проекта. Сначала он сохраняет значения сериализуемых переменных во всех загруженных скриптах, перезагружает скрипты, а затем восстанавливает значения. Данные, хранящиеся в несериализуемых переменных, теряются.
Это затрагивает все окна редактора и все скрипты MonoBehaviour в проекте. В отличие от остальных случаев сериализации, при перезагрузке Unity по умолчанию сериализует и закрытые поля, даже если у них нет SerializeField атрибут.