using System.Collections.Generic; using System.Linq; using Base; using Prefab; using UnityEngine; namespace Managers { public class EntityManage:Utils.MonoSingleton,ITick { public Dictionary> factionEntities = new(); public GameObject entityLevel; public EntityPrefab entityPrefab; public void Tick() { foreach (var faction in factionEntities) { List entitiesToRemove = new List(); foreach (var entityPrefab in faction.Value) { if (entityPrefab.entity.IsDead) { entitiesToRemove.Add(entityPrefab); } else { ITick itike = entityPrefab.entity; itike.Tick(); } } // 删除所有标记为死亡的实体 foreach (var entityToRemove in entitiesToRemove) { faction.Value.Remove(entityToRemove); Destroy(entityToRemove.gameObject); } } } /// /// 根据给定的PawnDef生成一个实体对象。 /// /// 定义实体属性的PawnDef对象。 /// 实体生成的位置。 /// /// 1. 如果entityPrefab或pawnDef为null,则不会生成实体。 /// 2. 实体将被创建在entityLevel.transform下。 /// 3. 使用EntityPrefab组件初始化实体。 /// public void GenerateEntity(Data.PawnDef pawnDef, Vector3 pos) { // 检查entityPrefab是否为空 if (entityPrefab == null) { Debug.LogError("Error: entityPrefab is null. Please assign a valid prefab."); return; } // 检查pawnDef是否为空 if (pawnDef == null) { Debug.LogError("Error: PawnDef is null. Cannot generate entity without a valid PawnDef."); return; } try { // 实例化实体对象 var entity = Instantiate(entityPrefab.gameObject, pos, Quaternion.identity, entityLevel.transform); // 获取EntityPrefab组件 var entityComponent = entity.GetComponent(); // 检查EntityPrefab组件是否存在 if (entityComponent == null) { Debug.LogError($"Error: EntityPrefab component not found on the instantiated object: {entity.name}"); return; } // 初始化实体组件 entityComponent.Init(pawnDef); // 确保派系键存在,并初始化对应的列表 var factionKey = pawnDef.attributes.label == null ? "default" : pawnDef.attributes.label; if (!factionEntities.ContainsKey(factionKey)) { factionEntities[factionKey] = new List(); } factionEntities[factionKey].Add(entityComponent); } catch (System.Exception ex) { // 捕获并记录任何异常 Debug.LogError($"An error occurred while generating the entity: {ex.Message}"); } } protected override void OnStart() { factionEntities.Clear(); } } }