Привет.

Это перевод моего поста.

Когда вы переносите проект с использования Resources на Addressables, вы определенно столкнётесь с проблемой фантомных (скрытых, устаревших, неиспользуемых) ссылок на ассеты, которые могут при работе игры привести к дублированию ассетов в памяти.

В этом посте вы найдете встретившиеся мне случаи и как я их разрешил

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

Analyze - окно, которое идёт в комплекте с Addressables, открывается по нажатию Window / Asset Management / Addressables / Analyze
Analyze - окно, которое идёт в комплекте с Addressables, открывается по нажатию Window / Asset Management / Addressables / Analyze

Analyze - окно, которое идёт в комплекте с Addressables, открывается по нажатию Window / Asset Management / Addressables / Analyze, найдет разрешаемые зависимости, по нажатию кнопки их разрешит. и покажет неразрешимые - о них мы еще поговорим

Окно для осмотра зависимостей на основе AssetDatabase.GetDependencies(assetPath)
Окно для осмотра зависимостей на основе AssetDatabase.GetDependencies(assetPath)

AssetDatabase.GetDependencies(assetPath) вы можете написать собственный инструмент для осмотра зависимостей ассета. Функция имеет хорошую производительность, поэтому этот способ вполне имеет право на жизнь. Работает только в одну сторону

Experimental Dependecy Viewer - официально окно для осмотра зависимостей
Experimental Dependecy Viewer - официально окно для осмотра зависимостей

Experimental Dependecy Viewer - официальный upm-пекедж для просмотра зависимостей. медленный ( после изменений необходимо перестраивать индекс всего проекта, что занимает много времени в большой проекте). Работает в обе стороны

Частные случаи неразрешимых зависимостей

  1. Material.savedProperties.TexEnvs

Material.savedProperties.TexEnvs
Material.savedProperties.TexEnvs

Материал хранит ссылки на текстуры, которые вы назначаете для текущего шейдера. Если позже вы переключитесь на другой шейдер, у которого другие поля для текстур, ссылки на старые текстуры останутся.

Решение:

MaterialPropertyCleaner - окно с открытым исходным кодом, для очистки не использующихся параметров

MaterialPropertyCleaner
MaterialPropertyCleaner
  • Выберите материалы

  • нажмите Remove Old Texture References

  1. Asset.ExternalObjects

Ассет может иметь ссылки в виде ExternalObjects, например, в ассете-модели через инспектор вы можете назначить ссылку на материал. Позже вы переключаете ModelMaterialMode на "No", но ссылка останется

Решение:

  1. Object defaultReferences

Вы можете назначить ссылки по умолчанию для MonoBehaviour, ScriptblaObject, Shader. Распространённая практика:

defaultReference на Preset для скрипта SoundsProfile : ScriptableObject
defaultReference на Preset для скрипта SoundsProfile : ScriptableObject
  • указать в шейдер текстуру, которая будет по умолчанию, но позже может быть заменена

  • указать в скрипте MonoBehaviour или ScirptableObject ссылку на существующий ScriptableObject или Prefab (GameObject)

Решение:

Выберите файл Shader / MonoBehaviour / ScriptableObject и занулите ссылку вручную, нажав "Delete"

  1. "Built in extra"

Если объект из сцены или ресурсов ссылается на ассет из категории "Built in extra", Addressables.Analyze помечает это как неразрешимую зависимость

Ресурсы из Built in extra:

Default-Skybox выбран по умолчанию при создании сцены
Default-Skybox выбран по умолчанию при создании сцены
  • встроенные спрайты

  • встроенные шейдеры

  • дефолтные Спрайты, частицы, материал Skybox

  • примитивные меши: Cube, Plane, Capsule, Sphere

UISprite выбран по умолчанию при создании дефолтной кнопки
UISprite выбран по умолчанию при создании дефолтной кнопки
  1. Удалённые ссылки в скриптах

Если вы:

  • создали ScriptableObject

  • добавили к нему поле ссылки

  • присвоили эту ссылку объекту

  • сохранили ассет

  • удалили ссылку из скрипта

Ссылка останется сериализованной. Окно Analyze пометит эту зависимость как неразрешимую

Решение:

ForceReserialzeAssets(assetPath) ресериализовать ассет, содержащий ссылку

Мы также активно использовали мой Asset Process Graph для массовой замены ссылок он доступен на GitHub

Asset Process Graph
Asset Process Graph

Комментарии (0)