← Назад к вопросам

Работали ли с Addressables

1.0 Junior🔥 121 комментариев
#Оптимизация#Ресурсы и ассеты

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Мой опыт работы с Addressables

Да, я работал с Unity Addressables в нескольких крупных проектах, и это один из наиболее мощных инструментов в современном пайплайне разработки на Unity для управления контентом. Мой опыт охватывает как настройку системы "с нуля", так и оптимизацию уже существующих проектов, переведённых с legacy AssetBundles.

Ключевые сценарии применения и преимущества

Я использовал Addressables для решения следующих задач:

  • Декомпозиция и управление загрузкой контента: Разделение ресурсов игры (префабы, сцены, аудио, конфиги) на группы (например, UI, Characters, Environments_Level1, Localization_RU). Это позволяет загружать и выгружать контент по мере необходимости, а не хранить всё в памяти.
  • Реализация системы загрузки и прогресса: Создание комплексных загрузочных экранов с точным отображением прогресса через DownloadStatus и корутин/асинхронных операций.
  • Оптимизация первого запуска и размера билда: Настройка Remote Catalog и размещение тяжёлых ресурсов (видео, HQ-текстуры) на CDN (например, AWS S3 или Firebase Hosting). Это позволяет значительно сократить размер установочного пакета (APK/IPA) и доставлять обновления контента минуя магазины приложений.
  • Динамическое обновление контента ("LiveOps"): Механика сезонных событий, где новые модели персонажей, уровни и баланс-конфиги подгружаются с сервера без необходимости выпускать патч. Использовал Catalog Update API для проверки и загрузки обновлённых бандлов.
  • Платформенная специфика: Корректная настройка профилей (StandaloneWindows, Android, iOS) и групп для автоматической сборки под разные платформы с правильными настройками сжатия (LZ4, LZMA).

Пример кода: Асинхронная загрузка префаба и его инстанцирование

Вот типичный код, который я использую для безопасной загрузки ресурса с обработкой состояния и ошибок:

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using System.Threading.Tasks;

public class AssetLoader : MonoBehaviour
{
    [SerializeField] private AssetReference _characterPrefabReference; // Ссылка в инспекторе

    private GameObject _loadedCharacterInstance;
    private AsyncOperationHandle<GameObject> _loadHandle;

    public async Task<bool> LoadAndSpawnCharacterAsync(Vector3 position)
    {
        // 1. Загрузка ассета
        _loadHandle = Addressables.LoadAssetAsync<GameObject>(_characterPrefabReference);

        // Можно отслеживать прогресс
        // _loadHandle.GetDownloadStatus().Percent;

        // Ожидание завершения загрузки
        await _loadHandle.Task;

        if (_loadHandle.Status == AsyncOperationStatus.Succeeded)
        {
            // 2. Инстанцирование загруженного префаба
            var instantiateHandle = Addressables.InstantiateAsync(_characterPrefabReference, position, Quaternion.identity);
            await instantiateHandle.Task;

            if (instantiateHandle.Status == AsyncOperationStatus.Succeeded)
            {
                _loadedCharacterInstance = instantiateHandle.Result;
                return true;
            }
        }
        else
        {
            Debug.LogError($"Failed to load asset: {_loadHandle.OperationException}");
            // Важно: освобождаем хэндл даже при ошибке
            Addressables.Release(_loadHandle);
        }

        return false;
    }

    private void OnDestroy()
    {
        // 3. КРИТИЧЕСКИ ВАЖНО: освобождение ресурсов
        if (_loadedCharacterInstance != null)
        {
            Addressables.ReleaseInstance(_loadedCharacterInstance);
        }
        // Release загрузочного хэндла, если он был
        if (_loadHandle.IsValid())
        {
            Addressables.Release(_loadHandle);
        }
    }
}

Проблемы, с которыми сталкивался, и их решения

  1. Утечка памяти из-за незакрытых AsyncOperationHandle: Самая частая проблема. Решение — строгая дисциплина: каждому Load/InstantiateAsync должен соответствовать Release. Я использовал обёртки и паттерн, где жизненный цикл хэндла связан с жизненным циклом объекта (как в примере выше).
  2. Долгая сборка при большом количестве групп: Решалось оптимизацией структуры: объединением мелких, статичных групп и использованием периодической очистки Library/com.unity.addressables. Также настройкой политики построения (Disable Visible Sub Asset Representation).
  3. Сложности с отладкой в Editor (Play Mode Use Asset Database vs Simulate Groups): Использовал Simulate Groups для разработки и тестирования пайплайна загрузки, а Use Existing Build — для QA-тестирования финальных бандлов.
  4. Кастомизация UI для Build Scripts: Для интеграции в CI/CD (Jenkins) писал кастомные скрипты построения на C#, которые вызывали AddressableAssetSettings.CleanPlayerContent() и AddressableAssetSettings.BuildPlayerContent() с нужными параметрами.

Итог: Addressables — это промышленный стандарт для управления контентом в средних и крупных проектах на Unity. Его освоение требует понимания асинхронных операций, управления памятью и пайплайна сборки, но инвестиции окупаются гибкостью, уменьшением размера билда и возможностями для LiveOps. Я считаю этот опыт критически важным для профессионального Unity-разработчика.