using System; 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 EntityPrefab defaultEntityPrefab; public List FindEntitiesByFaction(string factionKey) { if (factionEntities.TryGetValue(factionKey, out var entities)) { return entities; // 如果找到,返回对应的实体列表 } return new List(); // 如果未找到,返回一个空列表 } public void Tick() { foreach (var faction in factionEntities) { var 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."); GenerateDefaultEntity(pos); return; } // 检查 pawnDef 是否为空 if (pawnDef == null) { Debug.LogError("Error: PawnDef is null. Cannot generate entity without a valid PawnDef."); GenerateDefaultEntity(pos); return; } GameObject instantiatedEntity = null; // 用于跟踪已实例化的对象 try { // 实例化实体对象 instantiatedEntity = Instantiate(entityPrefab.gameObject, pos, Quaternion.identity, entityLevel.transform); // 获取 EntityPrefab 组件 var entityComponent = instantiatedEntity.GetComponent(); // 检查 EntityPrefab 组件是否存在 if (entityComponent == null) { throw new InvalidOperationException($"Error: EntityPrefab component not found on the instantiated object: {instantiatedEntity.name}"); } // 初始化实体组件 entityComponent.Init(pawnDef); // 确保派系键存在,并初始化对应的列表 var factionKey = pawnDef.attributes.label ?? "default"; // 使用 null 合并运算符简化代码 if (!factionEntities.ContainsKey(factionKey)) { factionEntities[factionKey] = new List(); } factionEntities[factionKey].Add(entityComponent); } catch (System.Exception ex) { // 如果有已实例化的对象,则销毁它 if (instantiatedEntity != null) { Destroy(instantiatedEntity); // 删除已创建的对象 } // 捕获并记录任何异常 Debug.LogError($"An error occurred while generating the entity: {ex.Message}\nStack Trace: {ex.StackTrace}"); // 调用默认生成方法 GenerateDefaultEntity(pos); } } public void GenerateDefaultEntity(Vector3 pos) { var entity = Instantiate(defaultEntityPrefab.gameObject, pos, Quaternion.identity, entityLevel.transform); var entityComponent = entity.GetComponent(); const string factionKey = "default"; if (!factionEntities.ContainsKey(factionKey)) { factionEntities[factionKey] = new List(); } entityComponent.DefaultInit(); factionEntities[factionKey].Add(entityComponent); } protected override void OnStart() { factionEntities.Clear(); } private void Start() { var pre = Resources.Load("Default/DefaultEntity"); defaultEntityPrefab = pre.GetComponent(); } } }