Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Обновление базы данных Ассетов

Unity обновляет базу данных объектов в следующих случаях:

Некоторые другие API AssetDatabase запускают Refresh(), но только для указанных вами Активов. Например, CreateAsset() и ImportAsset().

Unity выполняет следующие шаги во время обновления базы данных объектов:

  1. Он ищет изменения в файлах объектов, а затем обновляет исходную базу данных объектов.
  2. Он импортирует и компилирует файлы, связанные с кодом, такие как файлы .dll, .asmdef, .asmref, .rsp и .cs.
  3. Затем он перезагружает домен, если Обновить не было вызвано из сценария.
  4. Он выполняет пост-обработку всех ресурсов для импортированных файлов, связанных с кодом.
  5. Затем импортируются объекты, не связанные с кодом, и выполняется постобработка всех оставшихся импортированных объектов.
  6. Затем выполняется горячая перезагрузка ресурсов
  7. .

Подробный процесс обновления базы данных активов

Unity выполняет действия, описанные в предыдущем разделе, во время обновления базы данных активов. В этом разделе этот процесс описан более подробно. Эти шаги выполняются внутри цикла, и некоторые шаги могут привести к перезапуску процесса обновления (например, если импорт ассета создает другие ассеты, которые Unity также необходимо импортировать).

Unity перезапускает цикл обновления базы данных активов при следующих условиях:

  • Если после импорта файл, который использовал импортер, изменился на диске.
  • Если в OnPostProcessAllAssets вы вызываете любой из следующих способов:
  • Если отметка времени импортируемого файла изменяется во время импорта, файл ставится в очередь на повторный импорт.
  • Когда импортер создает файл в середине импорта (например, модели FBX могут перезапустить обновление, извлекая свои текстуры из модели).

Поиск изменений на диске

Когда Unity ищет изменения на диске, она сканирует папки Assets и Packages в вашем проекте, чтобы проверить, нет ли файлов. были добавлены, изменены или удалены с момента последнего сканирования. Он собирает все изменения в список для обработки на следующем шаге.

Обновить исходную базу данных объектов

После того как Unity соберет список файлов, она получит хэши файлов, которые были добавлены или изменены. Затем он обновляет базу данных активов с помощью идентификаторов GUID для этих файлов и удаляет записи для файлов, которые были обнаружены как удаленные.

Отслеживание зависимостей

База данных объектов отслеживает два типа зависимостей объектов: статические зависимости и динамические зависимости. Если какая-либо зависимость
Посмотрите в Словарь
изменения объекта, Unity инициирует повторный импорт этого объекта.

Статические зависимости

Статическая зависимость – это значение, параметр или свойство, от которых зависит средство импорта. Статические зависимости известны до того, как актив будет импортирован, и на них не влияет поведение импортера в процессе импорта. Если статическая зависимость объекта изменяется, Unity повторно импортирует этот объект.

Некоторые распространенные статические зависимости:

  • Название объекта
  • Идентификатор импортера, связанного с объектом.
  • Версия импортера
  • Текущая целевая платформа сборки.
Динамические зависимости

Unity обычно обнаруживает динамические зависимости объекта в процессе импорта. Это связано с тем, что эти зависимости определяются содержимым исходного актива. Например, ShaderПрограмма, работающая на графическом процессоре. Подробнее
См. в Словарь
может ссылаться на другой шейдер, а PrefabТип актива, который позволяет хранить GameObject вместе с компонентами и свойствами. Префаб действует как шаблон, из которого вы можете создавать новые экземпляры объектов в сцене. Подробнее
См. в Словарь
может зависеть от других префабов.

Импортер также может использовать глобальное состояние условно на основе содержимого исходного ресурса, и в этом случае оно также становится динамической зависимостью. Примерами этого являются целевая платформа, цветовое пространство проекта, графический API, версия среды выполнения сценариев или сжатиетекстуры. метод хранения данных, который уменьшает объем требуемого дискового пространства. См. Сжатие текстур, Сжатие анимации, Сжатие звука, Сжатие компоновки.
Просмотреть в Словарь
.

Unity сохраняет эти динамические зависимости ресурса в контексте импорта объекта.

Импорт и компиляция файлов, связанных с кодом

В списке измененных или добавленных файлов Unity собирает те, которые относятся к коду, и отправляет их в конвейер компиляции скрипта. Компилятор создает сборки из файлов сценариев и файлов определения сборок в вашем проекте. Дополнительные сведения об этом шаге см. в документации по файлам определения компиляции скриптов.

Перезагрузите домен

Если Unity обнаружит какие-либо изменения сценария, она перезагрузит домен C#. Это происходит потому, что могут быть созданы новые импортеры по сценарию, и их логика потенциально может повлиять на результат импорта активов в очереди обновления. На этом шаге функция Refresh() перезапускается, чтобы гарантировать, что все новые импортеры, созданные по сценарию, вступят в силу.

Импорт ресурсов, не связанных с кодом

После того как Unity импортирует все ресурсы, связанные с кодом, и перезагружает домен, она переходит к оставшимся ресурсам. Импортер каждого актива обрабатывает этот тип актива и определяет типы файлов, которые он должен импортировать, на основе расширений имен файлов. Например, TextureImporter отвечает за импорт файлов .jpg, .png и .psd, среди прочего.

Существует два типа импортеров:

Unity сначала обрабатывает все встроенные импортеры, а затем все импортеры, созданные по сценарию, на отдельной фазе.

Когда средство импорта импортирует файл ресурса, Unity создает AssetImportContext. AssetImportContext сообщает о статических зависимостях актива.

Кроме того, на этапе импорта происходит несколько обратных вызовов.

Предварительная обработка вызовов средства импорта объектов:

Вызовы средства импорта активов после обработки:

Последний обратный вызов постобработки, который запускается после завершения импорта, – OnPostprocessAllAssets.

Существует ряд причин, которые могут привести к перезапуску процесса обновления в папке ресурсов. Вот некоторые из них:

  • Если не удалось импортировать объект

  • Если объект был изменен на этапе импорта обновления. Например, если файл в списке изменен, поэтому его дата изменения не совпадает с датой предыдущего обновления. Это может произойти, если вы начнете извлекать файлы из системы управления версиямидля управления изменениями файлов. Вы можете использовать Unity в сочетании с наиболее распространенными инструментами контроля версий, включая Perforce, Git, Mercurial и PlasticSCM. Дополнительная информация
    Просматривать в Словарь
    , пока редактор находится в фокусе.

  • Если объект создал другие ресурсы во время импорта. Например: при импорте FBX текстуры могут быть извлечены из FBX и помещены в проект, а это означает, что Unity должна импортировать текстуры (и любые создаваемые ими артефакты).

  • Если вы принудительно повторно импортируете файл во время одного из обратных вызовов до/после обработки или внутри OnPostProcessAllAssets, например, с помощью AssetDatabase.ForceReserializeAssets или AssetImport.SaveAndReimport. Обратите внимание: вы должны быть осторожны, чтобы не вызвать бесконечные циклы повторного импорта, если вы это сделаете.

  • Если перезагрузка сборки происходит после компиляции скриптовфрагмента кода, позволяющего создавать собственные компоненты, запускать игровые события, изменять свойства компонентов с течением времени и реагировать на действия пользователя любым удобным для вас способом. Подробнее
    См. в Словарь
    . Если вы создаете файл C# во время процесса обновления, этот новый файл необходимо затем скомпилировать, чтобы Unity перезапустила обновление.

  • Если вы сохраните объект как «Только текст», но объект должен быть сериализован как двоичный, произойдет перезапуск. (Например, сцены с ландшафтами должны быть сериализованы как двоичные, поскольку данные ландшафта будут громоздкими, если их рассматривать как массив символов в текстовом файле.)

Горячая перезагрузка

Горячая перезагрузка — это процесс, в котором Unity импортирует и применяет любые изменения к сценариям и активам, когда редактор открыт. Это может произойти, когда редактор находится в режиме воспроизведения или вне режима воспроизведения. Вам не нужно перезапускать приложение или редактор, чтобы изменения вступили в силу.

Когда вы изменяете и сохраняете сценарий, Unity выполняет горячую перезагрузку всех данных сценария проекта. Сначала он сохраняет все сериализуемые значения переменных во всех загруженных сценариях, перезагружает сценарии, а затем восстанавливает значения. Все данные, хранящиеся в несериализуемых переменных, теряются при горячей перезагрузке.

Примечание. Unity сначала импортирует ресурсы, импортированные с помощью (встроенного DefaultImporter)[BuiltInImporters], а затем ресурсы сценария, поэтому он не вызывает какие-либо определяемые сценарием PostProcessAllAssets для ресурсов по умолчанию.

Конец обновления

После выполнения всех этих шагов Refresh() завершается. База данных артефактов обновляется соответствующей информацией, а необходимые файлы результатов импорта создаются на диске.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3