using System; using System.Collections.Generic; using Code.Infrastructure.Configs; using Cysharp.Threading.Tasks; using Reflex.Core; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; namespace Code.Infrastructure.Utils { public class MultipleConfig : IDisposable where TConfig : ScriptableObject { private AsyncOperationHandle> _configsHandle; public IList Configs => _configsHandle.Result; public async UniTask> LoadConfigs() { if (_configsHandle.IsValid()) return _configsHandle.Result; var configLocator = Container.RootContainer.Resolve(); var label = configLocator.TryGetManyConfigAssetReferences(); _configsHandle = Addressables.LoadAssetsAsync(label); await _configsHandle; return _configsHandle.Result; } public void Dispose() { if(_configsHandle.IsValid()) _configsHandle.Release(); } } public class SingleConfig : IDisposable where TConfig : ScriptableObject { private AsyncOperationHandle _configHandle; public TConfig Config => _configHandle.IsDone ? _configHandle.Result : null; public async UniTask LoadConfig() { if (_configHandle.IsValid()) return _configHandle.Result; var configLocator = Container.RootContainer.Resolve(); var label = configLocator.TryGetConfigAssetReference(); _configHandle = Addressables.LoadAssetAsync(label); await _configHandle; return _configHandle.Result; } public void Dispose() { if(_configHandle.IsValid()) _configHandle.Release(); } } }