Привет.
Это перевод моего поста.
Когда вы переносите проект с использования Resources на Addressables, вы определенно столкнётесь с проблемой фантомных (скрытых, устаревших, неиспользуемых) ссылок на ассеты, которые могут при работе игры привести к дублированию ассетов в памяти.
В этом посте вы найдете встретившиеся мне случаи и как я их разрешил
Анализ зависимостей ассета
Analyze - окно, которое идёт в комплекте с Addressables, открывается по нажатию Window / Asset Management / Addressables / Analyze, найдет разрешаемые зависимости, по нажатию кнопки их разрешит. и покажет неразрешимые - о них мы еще поговорим
AssetDatabase.GetDependencies(assetPath) вы можете написать собственный инструмент для осмотра зависимостей ассета. Функция имеет хорошую производительность, поэтому этот способ вполне имеет право на жизнь. Работает только в одну сторону
Experimental Dependecy Viewer - официальный upm-пекедж для просмотра зависимостей. медленный ( после изменений необходимо перестраивать индекс всего проекта, что занимает много времени в большой проекте). Работает в обе стороны
Частные случаи неразрешимых зависимостей
Material.savedProperties.TexEnvs
Материал хранит ссылки на текстуры, которые вы назначаете для текущего шейдера. Если позже вы переключитесь на другой шейдер, у которого другие поля для текстур, ссылки на старые текстуры останутся.
Решение:
MaterialPropertyCleaner - окно с открытым исходным кодом, для очистки не использующихся параметров
Выберите материалы
нажмите Remove Old Texture References
Asset.ExternalObjects
Ассет может иметь ссылки в виде ExternalObjects, например, в ассете-модели через инспектор вы можете назначить ссылку на материал. Позже вы переключаете ModelMaterialMode на "No", но ссылка останется
Решение:
AssetImporter.GetExternalObjectMap() получить ссылки
AssetImporter.RemoveRemap() удалить
Object defaultReferences
Вы можете назначить ссылки по умолчанию для MonoBehaviour, ScriptblaObject, Shader. Распространённая практика:
указать в шейдер текстуру, которая будет по умолчанию, но позже может быть заменена
указать в скрипте MonoBehaviour или ScirptableObject ссылку на существующий ScriptableObject или Prefab (GameObject)
Решение:
Выберите файл Shader / MonoBehaviour / ScriptableObject и занулите ссылку вручную, нажав "Delete"
"Built in extra"
Если объект из сцены или ресурсов ссылается на ассет из категории "Built in extra", Addressables.Analyze помечает это как неразрешимую зависимость
Ресурсы из Built in extra:
встроенные спрайты
встроенные шейдеры
дефолтные Спрайты, частицы, материал Skybox
примитивные меши: Cube, Plane, Capsule, Sphere
Удалённые ссылки в скриптах
Если вы:
создали ScriptableObject
добавили к нему поле ссылки
присвоили эту ссылку объекту
сохранили ассет
удалили ссылку из скрипта
Ссылка останется сериализованной. Окно Analyze пометит эту зависимость как неразрешимую
Решение:
ForceReserialzeAssets(assetPath) ресериализовать ассет, содержащий ссылку
Мы также активно использовали мой Asset Process Graph для массовой замены ссылок он доступен на GitHub