/// <summary> /// 清理隐藏实体完成事件。 /// </summary> public override void Clear() { EntityId = default(int); EntityAssetName = default(string); EntityGroup = default(EntityGroup); UserData = default(object); }
/// <summary> /// 显示实体 /// </summary> /// <param name="entityId">实体编号</param> /// <param name="entityAssetName">实体资源名称</param> /// <param name="entityGroup">实体组</param> /// <param name="entityInstance">实体实例</param> /// <param name="isNewInstance">是否是新实例</param> /// <param name="duration">加载持续时间</param> /// <param name="userData">用户自定义数据</param> private void ShowEntity(int entityId, string entityAssetName, EntityGroup entityGroup, object entityInstance, bool isNewInstance, float duration, object userData) { try { //使用辅助器创建实体 Entity entity = m_EntityHelper.CreateEntity(entityInstance, entityGroup, userData); if (entity == null) { throw new Exception("使用辅助器创建实体失败"); } //创建实体信息对象 EntityInfo entityInfo = new EntityInfo(entity); m_EntityInfos.Add(entityId, entityInfo); entityInfo.Status = EntityStatus.WillInit; entity.OnInit(entityId, entityAssetName, entityGroup, isNewInstance, userData); entityInfo.Status = EntityStatus.Inited; entityGroup.AddEntity(entity); entityInfo.Status = EntityStatus.WillShow; entity.OnShow(userData); entityInfo.Status = EntityStatus.Showed; //派发显示实体成功事件 ShowEntitySuccessEventArgs se = new ShowEntitySuccessEventArgs(); m_EventManager.Fire(this, se.Fill(userData, entity, duration)); } catch (Exception exception) { //派发显示实体失败事件 ShowEntityFailureEventArgs fe = new ShowEntityFailureEventArgs(); m_EventManager.Fire(this, fe.Fill(userData, entityId, entityAssetName, entityGroup.Name, exception.Message)); } }
public override void Update(float elapseSeconds, float realElapseSeconds) { //回收需要回收的实体 while (m_RecycleQueue.Count > 0) { EntityInfo entityInfo = m_RecycleQueue.First.Value; m_RecycleQueue.RemoveFirst(); Entity entity = entityInfo.Entity; EntityGroup entityGroup = entity.EntityGroup; if (entityGroup == null) { Debug.LogError("要回收的实体的实体组为空"); return; } entityInfo.Status = EntityStatus.WillRecycle; entity.OnRecycle(); entityInfo.Status = EntityStatus.Recycled; entityGroup.UnspawnEntity(entity); } foreach (KeyValuePair <string, EntityGroup> entityGroup in m_EntityGroups) { entityGroup.Value.Update(elapseSeconds, realElapseSeconds); } }
public LoadEntityInfo(int serialId, int entityId, EntityGroup entityGroup, object userData) { SerialId = serialId; EntityId = entityId; EntityGroup = entityGroup; UserData = userData; }
/// <summary> /// 填充隐藏实体完成事件 /// </summary> /// <returns>隐藏实体完成事件</returns> public HideEntityCompleteEventArgs Fill(int entityId, string entityAssetName, object userData, EntityGroup entityGroup) { EntityId = entityId; EntityAssetName = entityAssetName; UserData = userData; EntityGroup = entityGroup; return(this); }
/// <summary> /// 获取所有实体组 /// </summary> /// <returns>所有实体组</returns> public EntityGroup[] GetAllEntityGroups() { int index = 0; EntityGroup[] entityGroups = new EntityGroup[m_EntityGroups.Count]; foreach (KeyValuePair <string, EntityGroup> entityGroup in m_EntityGroups) { entityGroups[index++] = entityGroup.Value; } return(entityGroups); }
/// <summary> /// 实体初始化 /// </summary> /// <param name="entityId">实体编号</param> /// <param name="entityAssetName">实体资源名称</param> /// <param name="entityGroup">实体所属的实体组</param> /// <param name="isNewInstance">是否是新实例</param> /// <param name="userData">用户自定义数据</param> public void OnInit(int entityId, string entityAssetName, EntityGroup entityGroup, bool isNewInstance, object userData) { Id = entityId; EntityAssetName = entityAssetName; if (isNewInstance) { EntityGroup = entityGroup; } else if (EntityGroup != entityGroup) { Debug.LogError("非新实例对象的实体初始化时实体组不一致"); return; } //获取实体信息 ShowEntityInfo showEntityInfo = (ShowEntityInfo)userData; //根据信息获取实体逻辑类型 Type entityLogicType = showEntityInfo.EntityLogicType; if (entityLogicType == null) { Debug.LogError("实体初始化时实体逻辑类型为空"); return; } if (Logic != null) { //已有实体逻辑脚本类型与实体信息中的类型相同时就直接启用 if (Logic.GetType() == entityLogicType) { Logic.enabled = true; return; } //否则销毁掉 Destroy(Logic); Logic = null; } //将实体逻辑处理脚本挂到游戏物体上 Logic = gameObject.AddComponent(entityLogicType) as EntityLogic; if (Logic == null) { Debug.LogError("实体逻辑脚本挂载到游戏物体上失败"); return; } //调用它的初始化方法 Logic.OnInit(showEntityInfo.UserData); }
/// <summary> /// 获取实体组 /// </summary> /// <param name="entityGroupName">实体组名称</param> /// <returns>要获取的实体组</returns> public EntityGroup GetEntityGroup(string entityGroupName) { if (string.IsNullOrEmpty(entityGroupName)) { Debug.LogError("要获取的实体组名称为空"); } EntityGroup entityGroup = null; if (m_EntityGroups.TryGetValue(entityGroupName, out entityGroup)) { return(entityGroup); } return(null); }
/// <summary> /// 创建实体 /// </summary> /// <param name="entityInstance">实体实例</param> /// <param name="entityGroup">实体所属的实体组</param> /// <param name="userData">用户自定义数据</param> /// <returns>实体</returns> public override Entity CreateEntity(object entityInstance, EntityGroup entityGroup, object userData) { GameObject gameObject = entityInstance as GameObject; if (gameObject == null) { Debug.LogError("实例化的实体为空"); return(null); } //将创建的实体作为辅助器的子物体 gameObject.transform.SetParent(entityGroup.Helper.transform); //挂载Entity脚本 Entity entity = gameObject.GetOrAddComponent <Entity>(); return(entity); }
/// <summary> /// 隐藏实体 /// </summary> /// <param name="entityId">实体编号</param> /// <param name="userData">用户自定义数据</param> public void HideEntity(int entityId, object userData = null) { //要隐藏的实体正在加载,就直接释放 if (IsLoadingEntity(entityId)) { int serialId = 0; if (!m_EntitiesBeingLoaded.TryGetValue(entityId, out serialId)) { Debug.LogError("没找到实体;" + entityId); } m_EntitiesToReleaseOnLoad.Add(serialId); m_EntitiesBeingLoaded.Remove(entityId); return; } //获取到实体信息 EntityInfo entityInfo = GetEntityInfo(entityId); if (entityInfo == null) { Debug.LogError("获取要隐藏的实体的实体信息为空:" + entityId); return; } //获取实体与它的子实体 Entity entity = entityInfo.Entity; Entity[] childEntities = entityInfo.GetChildEntities(); foreach (Entity childEntity in childEntities) { //递归隐藏子实体 HideEntity(childEntity.Id, userData); } //解除自身与父实体的关系 DetachEntity(entity.Id, userData); //隐藏实体 entityInfo.Status = EntityStatus.WillHide; entity.OnHide(userData); entityInfo.Status = EntityStatus.Hidden; //将隐藏的实体从实体组与实体信息字典中移除 EntityGroup entityGroup = entity.EntityGroup; if (entityGroup == null) { Debug.LogError("隐藏的实体的实体组为空"); } entityGroup.RemoveEntity(entity); if (!m_EntityInfos.Remove(entity.Id)) { Debug.LogError("将隐藏的实体从实体信息字典中移除失败"); } //派发隐藏实体完成事件 HideEntityCompleteEventArgs e = ReferencePool.Acquire <HideEntityCompleteEventArgs>(); m_EventManager.Fire(this, e.Fill(entity.Id, entity.EntityAssetName, userData, entityGroup)); //将隐藏的实体加入回收队列 m_RecycleQueue.AddLast(entityInfo); }
/// <summary> /// 显示实体。 /// </summary> /// <param name="entityId">实体编号</param> /// <param name="entityLogicType">实体逻辑类型</param> /// <param name="entityAssetName">实体资源名称</param> /// <param name="entityGroupName">实体组名称</param> /// <param name="userData">用户自定义数据</param> public void ShowEntity(int entityId, Type entityLogicType, string entityAssetName, string entityGroupName, object userData) { if (entityLogicType == null) { Debug.LogError("显示实体时的实体逻辑类型为空"); return; } ShowEntityInfo info = new ShowEntityInfo(entityLogicType, userData); if (m_ResourceManager == null) { Debug.LogError("显示实体时的资源管理器为空"); return; } if (m_EntityHelper == null) { Debug.LogError("显示实体时的辅助器为空"); return; } if (string.IsNullOrEmpty(entityAssetName)) { Debug.LogError("显示实体时的实体资源名称为空"); return; } if (string.IsNullOrEmpty(entityGroupName)) { Debug.LogError("显示实体时的实体组名称为空"); return; } if (m_EntityInfos.ContainsKey(entityId)) { Debug.LogError("显示实体时的实体信息已存在"); return; } if (IsLoadingEntity(entityId)) { Debug.LogError("要显示的实体已在加载"); return; } //实体组检查 EntityGroup entityGroup = GetEntityGroup(entityGroupName); if (entityGroup == null) { Debug.LogError("显示实体时的实体组不存在"); return; } //尝试从对象池获取实体实例 EntityInstanceObject entityInstanceObject = entityGroup.SpawnEntityInstanceObject(entityAssetName); if (entityInstanceObject == null) { //没获取到就加载该实体 int serialId = m_Serial++; m_EntitiesBeingLoaded.Add(entityId, serialId); m_ResourceManager.LoadAsset(entityAssetName, m_LoadAssetCallbacks, new LoadEntityInfo(serialId, entityId, entityGroup, info)); return; } ShowEntity(entityId, entityAssetName, entityGroup, entityInstanceObject.Target, false, 0f, info); }
/// <summary> /// 创建实体 /// </summary> /// <param name="entityInstance">实体实例</param> /// <param name="entityGroup">实体所属的实体组</param> /// <param name="userData">用户自定义数据</param> /// <returns>实体</returns> public abstract Entity CreateEntity(object entityInstance, EntityGroup entityGroup, object userData);