using Cysharp.Threading.Tasks; using System; using System.Collections.Generic; using UnityEngine; using UVC.Core; using UVC.Pool; public class EntityManager : SingletonScene { private readonly Dictionary prefabPaths = new Dictionary() { {"box","prefabs/Box"} }; private Dictionary entityDatas = new Dictionary(); public Vector3 ObjectSize; public event Action OnEntityDestroyed; public event Action OnEntityTransferred; private GameObjectPool? entityPool; public GameObjectPool EntityPool { get { if (entityPool == null) { Debug.LogError("Pool is not initialized. Please call InitializePoolAsync first."); } return entityPool!; } } protected override void Init() { InitializeEntityPoolAsync().Forget(); } private async UniTask InitializeEntityPoolAsync() { if (entityPool != null) return; var prefab = await Resources.LoadAsync(prefabPaths["box"]) as GameObject; if (prefab == null) { Debug.LogError($"Prefab not found at path: {prefabPaths["box"]}"); return; } entityPool = new GameObjectPool(prefab, transform); ObjectSize = prefab.GetComponent().sharedMesh.bounds.size; } public Entity SpawnEntity(string entityName, string prefabName) { var entity = entityPool.GetItem($"{entityName}"); entity.name = entityName; SetEntity(entity, prefabName); if (!entityDatas.ContainsKey(entityName)) { entityDatas.Add(entityName, entity); } else { entityDatas[entityName] = entity; } return entity; } public List SpawnEntites(List entityNames) { List entities = new List(); foreach (var entityName in entityNames) { var entity = entityPool.GetItem($"{entityName}"); entity.name = entityName; if (!entityDatas.ContainsKey(entityName)) { entityDatas.Add(entityName, entity); entities.Add(entity); } } return entities; } public Entity GetEntity(string entityName, string prefabName = null) { if (entityDatas.ContainsKey(entityName)) { var entity = entityDatas[entityName]; OnEntityTransferred?.Invoke(entity); return entity; } else { return SpawnEntity(entityName, prefabName); } } public List GetEntities(List entityNames, List prefabNames = null) { List entities = new List(); foreach (var entityName in entityNames) { var entity = GetEntity(entityName); entities.Add(entity); } return entities; } public void SetEntity(Entity entity, string prefabName) { var prefabData = PrefabManager.Instance.GetPrefab(prefabName); if (!string.IsNullOrEmpty(prefabName) && prefabData != null) { string colorHex = $"{prefabData.color}"; if (ColorUtility.TryParseHtmlString(colorHex, out var color)) { entity.SetColor(color); } } } public void DestroyEnity(List entityNames) { foreach (var entityName in entityNames) { if (entityDatas.ContainsKey(entityName)) { var entity = entityDatas[entityName]; OnEntityTransferred?.Invoke(entity); OnEntityDestroyed?.Invoke(entity); Destroy(entity.gameObject); entityDatas.Remove(entityName); } } } }