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

Что будет с ресурсом, загруженным в MonoBehaviour с помощью Addressables, если MonoBehaviour будет удален?

1.6 Junior🔥 171 комментариев
#Ресурсы и ассеты

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

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

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

Взаимодействие Addressables и жизненного цикла MonoBehaviour

При удалении MonoBehaviour (например, через Destroy(gameObject) или уничтожение родительского объекта) ресурс, загруженный через Addressables, НЕ будет автоматически выгружен. Это фундаментальное отличие от классической системы Resources или прямых ссылок на ассеты. Система Addressables использует собственную систему управления памятью на основе reference counting.

Ключевые механизмы работы

  1. Отсутствие автоматической привязки к GameObject Addressables не отслеживает жизненный цикл MonoBehaviour или GameObject. Загруженный ресурс существует независимо от того, уничтожен ли скрипт, который его загрузил.

  2. Система Reference Counting Каждый загруженный ресурс имеет внутренний счетчик ссылок. Методы LoadAssetAsync() и InstantiateAsync() увеличивают счетчик, а Release() — уменьшает. Когда счетчик достигает нуля, система может выгрузить ресурс из памяти.

Практический пример

Рассмотрим типичный сценарий:

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class ResourceLoader : MonoBehaviour
{
    private AsyncOperationHandle<GameObject> _handle;
    
    async void Start()
    {
        // Загружаем префаб через Addressables
        _handle = Addressables.LoadAssetAsync<GameObject>("Prefabs/MyCharacter");
        await _handle.Task;
        
        if (_handle.Status == AsyncOperationStatus.Succeeded)
        {
            Instantiate(_handle.Result, transform);
        }
    }
    
    void OnDestroy()
    {
        // ВАЖНО: явно освобождаем ресурс при уничтожении объекта
        Addressables.Release(_handle);
    }
}

Что происходит при удалении MonoBehaviour?

  • Без вызова Release(): Ресурс остается в памяти, счетчик ссылок не уменьшается. Это приводит к утечке памяти (memory leak).
  • С вызовом Release() в OnDestroy(): Ресурс корректно освобождается, счетчик уменьшается. Если это была последняя ссылка — ресурс выгружается.

Рекомендации по управлению ресурсами

Всегда реализуйте паттерн освобождения ресурсов:

  • Для асинхронных операций: Сохраняйте AsyncOperationHandle в поле класса и освобождайте его в OnDestroy()
  • Для экземпляров объектов: Используйте Addressables.InstantiateAsync() с сохранением handle для последующего освобождения
  • Для сцены: При использовании Addressables.LoadSceneAsync() также требуется вызов Addressables.UnloadSceneAsync()
// Правильное управление инстансированными объектами
AsyncOperationHandle<GameObject> instantiateHandle;

async void SpawnObject()
{
    instantiateHandle = Addressables.InstantiateAsync("Prefabs/MyObject");
    await instantiateHandle.Task;
}

void OnDestroy()
{
    if (instantiateHandle.IsValid())
    {
        Addressables.ReleaseInstance(instantiateHandle);
        // или Addressables.Release(instantiateHandle);
    }
}

Особые случаи и best practices

  • Адресная группа (Addressable Group) может иметь настройки Retain in Memory, которые влияют на поведение выгрузки
  • При использовании AssetReferences также требуется явное управление через методы ReleaseAsset() или ReleaseInstance()
  • Для сложных объектов рекомендуется использовать промежуточный менеджер ресурсов, который отслеживает все загруженные ассеты
  • В редакторе Unity можно отслеживать загруженные Addressables через Addressables Event Viewer (Window → Asset Management → Addressables → Event Viewer)

Вывод

Ресурс, загруженный через Addressables, продолжает существовать в памяти после удаления MonoBehaviour, если не был явно освобожден. Разработчик должен самостоятельно управлять жизненным циклом таких ресурсов, явно вызывая методы освобождения в соответствующих точках жизненного цикла объекта. Это обеспечивает гибкость, но требует дисциплины в управлении памятью для предотвращения утечек.

Что будет с ресурсом, загруженным в MonoBehaviour с помощью Addressables, если MonoBehaviour будет удален? | PrepBro