Exemple #1
0
 /// <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;
 }
Exemple #5
0
        /// <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);
        }
Exemple #7
0
        /// <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);
        }
Exemple #12
0
 /// <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);