[[Загрузка файлов|Стартовая страница]]
Эти четыре механизма в Unity предназначены для загрузки и управления ресурсами, но они используются в разных сценариях. Разберём их различия:
---
### 1. **[[Resources]]**
- **Что это?**
Статически загружаемые ресурсы, находящиеся в папке `Resources` внутри `Assets`. Доступ к ним осуществляется через `Resources.Load<T>("path")`.
- **Когда использовать?**
Когда нужны простые и быстрые загрузки без дополнительных настроек. Однако `Resources` загружаются в память при старте сцены, что может увеличить потребление памяти.
- **Минусы:**
- Все файлы из `Resources` попадают в билд, даже если не используются.
- Нет контроля над загрузкой — ресурсы загружаются сразу в память.
- Нет возможности обновлять ресурсы отдельно от основного билда.
---
### 2. **[[Addressables]]**
- **Что это?**
Современная система загрузки ресурсов, позволяющая динамически загружать и выгружать объекты по строковому ключу (`Addressables.LoadAssetAsync<T>("key")`). Основана на `Asset Bundles`, но автоматизирует их работу.
- **Когда использовать?**
Если нужны **динамическая загрузка**, **оптимизация памяти**, **возможность обновления контента** и **загрузка ресурсов по сети**.
- **Минусы:**
- Более сложная настройка по сравнению с `Resources`.
- Требует предварительной разметки ассетов и генерации `Addressables Groups`.
---
### 3. **[[Asset Bundles]]**
- **Что это?**
Это архивы ресурсов, которые можно загружать динамически (`AssetBundle.LoadAsset<T>("asset")`). Они создаются вручную при билде и могут загружаться из локальных файлов или по сети.
- **Когда использовать?**
Если требуется **модульное обновление контента** без обновления всего билда, например, в DLC или при загрузке ассетов с сервера.
- **Минусы:**
- Нужно заранее собирать `Asset Bundles`.
- Неудобное управление зависимостями (ресурсы могут дублироваться в нескольких бандлах).
- Требует дополнительного кэширования и очистки загруженных ресурсов.
---
### 4. **[[AssetDatabase]]**
- **Что это?**
API для работы с ассетами **только в редакторе Unity**. Позволяет находить, загружать и изменять ассеты (`AssetDatabase.LoadAssetAtPath<T>("Assets/MyAsset.prefab")`).
- **Когда использовать?**
При разработке инструментов для редактора, редакторских скриптов, импорта/экспорта данных в редакторе.
- **Минусы:**
- Не работает в билде (`AssetDatabase` отсутствует во время выполнения игры).
---
## **Сравнительная таблица:**
|Механизм|Поддержка в билде|Динамическая загрузка|Поддержка обновлений|Сложность использования|Где хранятся?|
|---|---|---|---|---|---|
|`Resources`|✅ Да|❌ Нет (всё загружается при запуске)|❌ Нет|⭐ Легко|Вшиты в билд|
|`Addressables`|✅ Да|✅ Да|✅ Да|⭐⭐⭐ Средне|Локально / сервер|
|`Asset Bundles`|✅ Да|✅ Да|✅ Да|⭐⭐⭐⭐ Сложно|Локально / сервер|
|`AssetDatabase`|❌ Только в редакторе|✅ Да|❌ Нет|⭐⭐⭐ Средне|В `Assets`|
---
## **Какой выбрать?**
- **`Resources`** → Простые проекты без сложного управления ресурсами.
- **`Addressables`** → Современный, универсальный способ для большинства игр.
- **`Asset Bundles`** → Когда нужна ручная загрузка пакетов ресурсов, например, для модов или DLC.
- **`AssetDatabase`** → Только для редакторских инструментов.
Если у Вас масштабная RTS с множеством сущностей, `Addressables` будет предпочтительнее, так как позволит загружать ресурсы по мере необходимости и снижать нагрузку на память.