Files
Hasebe/Assets/Code/Infrastructure/Audio/AudioFactory.cs
T
2026-09-20 15:26:03 +03:00

83 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using Code.Infrastructure.Configs;
using Code.Infrastructure.Utils;
using Cysharp.Threading.Tasks;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
namespace Code.Infrastructure.Audio
{
public interface IAudioFactory
{
void UnloadAudioClips(AudioPartition groupPartition);
UniTask LoadAudioClips(AudioPartition groupPartition);
public Dictionary<AudioPartition, Dictionary<int, AudioReference>> ReferenceDictionary { get; }
}
public interface IAudioFactoryInitializer
{
UniTask LoadConfigs();
}
public class AudioFactory : IAudioFactory, IDisposable, IAudioFactoryInitializer
{
private string _label;
private AsyncOperationHandle<IList<AudioInfoConfig>> _configsHandle;
public Dictionary<AudioPartition, Dictionary<int, AudioReference>> ReferenceDictionary { get; } = new();
public AudioFactory(IConfigLocator configLocator)
{
_label = configLocator.TryGetManyConfigAssetReferences<AudioInfoConfig>();
}
public async UniTask LoadConfigs()
{
if(!await AddressablesUtilities.CheckLabelExists(_label)) return;
_configsHandle = Addressables.LoadAssetsAsync<AudioInfoConfig>(_label);
await _configsHandle.ToUniTask();
foreach (AudioInfoConfig config in _configsHandle.Result)
{
if(!ReferenceDictionary.ContainsKey(config.GroupPartition))
ReferenceDictionary.Add(config.GroupPartition, new());
ReferenceDictionary[config.GroupPartition].Add(config.id, config.Reference);
}
}
public async UniTask LoadAudioClips(AudioPartition groupPartition)
{
foreach (var reference in ReferenceDictionary[groupPartition])
{
var load = reference.Value.Load();
if (load.Status == UniTaskStatus.Pending)
await load;
}
}
public void UnloadAudioClips(AudioPartition groupPartition)
{
foreach (var reference in ReferenceDictionary[groupPartition])
{
reference.Value.Unload();
}
}
public void Dispose()
{
foreach (var partition in ReferenceDictionary)
{
foreach (var reference in partition.Value)
{
reference.Value.Unload();
}
}
if(_configsHandle.IsValid()) _configsHandle.Release();
}
}
}