Second commit

This commit is contained in:
ThomasCharester committed 2026-09-20 15:26:03 +03:00
commit 36840f3ad4
999 files changed
+61364

No files matched your search

@@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using Code.Infrastructure.Configs;
using Code.Infrastructure.Utils;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
namespace Code.Infrastructure.Particles
{
public interface IParticleLoader
{
UniTask LoadParticleSystems(ParticlePartition partition);
void ReleaseParticles(ParticlePartition partition);
void Dispose();
}
public interface IParticleLoaderInitializer
{
UniTask LoadConfigs();
}
public class ParticleLoader : IParticleLoader, IParticleLoaderInitializer, IDisposable
{
private readonly string _label;
private Dictionary<ParticlePartition, Dictionary<int, ParticleInfo>> ParticleInfos { get; } = new();
private readonly Dictionary<ParticlePartition, Dictionary<int, AsyncOperationHandle<GameObject>>>
_particleSystemHandles = new();
private AsyncOperationHandle<IList<ParticleInfo>> _configsHandle;
private readonly IParticlePoolManagerForFabric _poolManagerForFabric;
public ParticleLoader(IConfigLocator configLocator, IParticlePoolManagerForFabric poolManagerForFabric)
{
_poolManagerForFabric = poolManagerForFabric;
_label = configLocator.TryGetManyConfigAssetReferences<ParticleInfo>();
for (var i = 0; i < typeof(ParticlePartition).GetEnumValues().Length; i++)
{
ParticleInfos.Add((ParticlePartition)i, new Dictionary<int, ParticleInfo>());
_particleSystemHandles.Add((ParticlePartition)i,
new Dictionary<int, AsyncOperationHandle<GameObject>>());
}
}
public async UniTask LoadConfigs()
{
if (!await AddressablesUtilities.CheckLabelExists(_label)) return;
_configsHandle = Addressables.LoadAssetsAsync<ParticleInfo>(_label);
await _configsHandle.ToUniTask();
foreach (var config in _configsHandle.Result)
ParticleInfos[config.particlePartition].Add(config.particleId, config);
}
public async UniTask LoadParticleSystems(ParticlePartition partition)
{
foreach (var particleInfo in ParticleInfos[partition])
if (!_particleSystemHandles[partition].ContainsKey(particleInfo.Key))
_particleSystemHandles[partition].Add(particleInfo.Key,
Addressables.LoadAssetAsync<GameObject>(particleInfo.Value.particleSystem));
else
_particleSystemHandles[partition][particleInfo.Key] =
Addressables.LoadAssetAsync<GameObject>(particleInfo.Value.particleSystem);
foreach (var handle in _particleSystemHandles[partition])
await handle.Value.ToUniTask();
foreach (var particleInfo in ParticleInfos[partition])
_poolManagerForFabric.CreatePoolOfParticles(
particleInfo.Value,
_particleSystemHandles[partition][particleInfo.Key].Result.GetComponent<ParticleSystem>()
);
}
public void ReleaseParticles(ParticlePartition partition)
{
if (_particleSystemHandles[partition].Count == 0) return;
foreach (var handle in _particleSystemHandles[partition])
{
_poolManagerForFabric.DeletePoolOfParticles(partition, handle.Key);
Addressables.Release(handle.Value);
}
_particleSystemHandles[partition].Clear();
}
public void Dispose()
{
foreach (var handles in _particleSystemHandles)
{
foreach (var handle in handles.Value)
{
_poolManagerForFabric.DeletePoolOfParticles(handles.Key, handle.Key);
handle.Value.Release();
}
}
_particleSystemHandles.Clear();
if (_configsHandle.IsValid()) _configsHandle.Release();
}
}
}