/// <summary>
 /// 初始化
 /// </summary>
 public void Initialize(AreaLayerInfo areaLayerInfo, AssetInfo[] assetInfos, AreaController areaController, int unloadRange = 3)
 {
     m_AreaController  = areaController;
     m_UnloadRange     = unloadRange;
     m_AreaLayerInfo   = areaLayerInfo;
     m_GridIndexs      = new Dictionary <long, int>();
     m_LoadedGrids     = new HashSet <Vector3Int>();
     m_NeedLoadGrids   = new List <Vector3Int>();
     m_NeedUnLoadGrids = new List <Vector3Int>();
     m_UnitController  = new UnitController();
     m_UnitController.Initialize(areaLayerInfo.m_Units, assetInfos, m_AreaController);
     //初始化虚拟格子
     if (m_AreaLayerInfo != null)
     {
         List <long> gridIndexs = m_AreaLayerInfo.AreaVirtualGridIndexs;
         if (gridIndexs != null && gridIndexs.Count > 0)
         {
             for (int iGrid = 0; iGrid < gridIndexs.Count; iGrid++)
             {
                 //导出索引时 要有个检查过程 判断是否有重复
                 m_GridIndexs.Add(gridIndexs[iGrid], iGrid);
             }
         }
     }
 }
Esempio n. 2
0
 /// <summary>
 /// Release current area
 /// </summary>
 public void RequestReleaseCurrentArea()
 {
     if (m_CurrentAreaController != null)
     {
         m_ExpiredAreaControllers.Add(m_CurrentAreaController);
         m_CurrentAreaController.RequestRelease();
         m_CurrentAreaController = null;
     }
 }
Esempio n. 3
0
 /// <summary>
 /// 初始化
 /// </summary>
 public void Initialize(List <SceneUnitInfo> unitInfos, AssetInfo[] assetInfos, AreaController areaController)
 {
     m_AreaController  = areaController;
     m_Units           = unitInfos;
     m_AssetInfos      = assetInfos;
     m_UnitCommands    = new Queue <UnitCommand>();
     m_UnitDatas       = new UnitData[m_Units.Count];
     m_NeedUnloadIndex = new List <int>();
     for (int iUnit = 0; iUnit < m_UnitDatas.Length; iUnit++)
     {
         m_UnitDatas[iUnit].SetState(UnitState.Released);
         m_UnitDatas[iUnit].ClearRef();
     }
 }
Esempio n. 4
0
        /// <summary>
        /// 切换Area
        /// </summary>
        private void TryChangeArea(int areaIndex)
        {
            if (m_CurrentAreaController != null)
            {
                ulong lastAreaUid = GetCurrentAreaUid();
                ulong newAreaUid  = areaIndex != Constants.NOTSET_AREA_INDEX
                    ? m_MapInfo.AreaInfos[areaIndex].Uid
                    : Constants.NOTSET_AREA_UID;
                if (lastAreaUid != newAreaUid)
                {
                    DebugUtility.Log(Constants.LOG_TAG, $"Begin change area from {lastAreaUid} to {newAreaUid}, {MapManager.GetInstance()._PlayerInfo}");
                }
            }

            if (m_CurrentAreaController != null)
            {
                m_CurrentAreaController.RequestRelease();
                m_ExpiredAreaControllers.Add(m_CurrentAreaController);
                m_CurrentAreaController = null;
            }

            if (areaIndex != Constants.NOTSET_AREA_INDEX)
            {
                AreaInfo targetAraeInfo = m_MapInfo.AreaInfos[areaIndex];
                if (m_LimitChangeToAreaUid == Constants.NOT_LIMIT_AREA_UID ||
                    m_LimitChangeToAreaUid == targetAraeInfo.Uid)
                {
                    m_State = State.ChangingArea;

                    m_CurrentAreaController = new AreaController();
                    m_CurrentAreaController.RequestInitialize(this, m_MapInfo.AreaInfos[areaIndex]);

                    DebugUtility.Log(Constants.LOG_TAG, "Begin invoke on changed area");
                    try
                    {
                        MapManager.GetInstance()._OnChangedArea?.Invoke(m_MapInfo.AreaInfos[areaIndex].Uid);
                        DebugUtility.Log(Constants.LOG_TAG, "End invoke on changed area");
                    }
                    catch (Exception e)
                    {
                        DebugUtility.LogError(Constants.LOG_TAG, string.Format("Invoke on changed area failed, Exception:\n{0}", e.ToString()));
                    }
                }
                else
                {
                    DebugUtility.LogVerbose(Constants.LOG_TAG, $"Cant change to area({targetAraeInfo.Uid}), because limit change to uid({m_LimitChangeToAreaUid})");
                }
            }
        }
Esempio n. 5
0
        /// <summary>
        /// 更新已经过期的Area,流程
        ///		等待已经实例化过程中的Unit实例化完
        ///		这些Area内的Unit会每帧销毁一些
        ///		等到所有Unit销毁完成后,<see cref="AreaController"/>的引用会被释放
        /// </summary>
        private void DoUpdate_ExpiredArea()
        {
            for (int iArea = m_ExpiredAreaControllers.Count - 1; iArea >= 0; iArea--)
            {
                AreaController iterAreaController = m_ExpiredAreaControllers[iArea];
                iterAreaController.DoUpdate();
                if (iterAreaController.IsReleased())
                {
                    try
                    {
                        DebugUtility.Log(Constants.LOG_TAG, $"Begin Invoke OnReleasedArea({iterAreaController.GetAreaUid()})");
                        MapManager.GetInstance()._OnReleasedArea?.Invoke(iterAreaController.GetAreaUid());
                        DebugUtility.Log(Constants.LOG_TAG, $"End Invoke OnReleasedArea({iterAreaController.GetAreaUid()})");
                    }
                    catch (Exception e)
                    {
                        DebugUtility.LogError(Constants.LOG_TAG, string.Format("Invoke OnReleasedArea Exception:\n{0}", e.ToString()));
                    }

                    m_ExpiredAreaControllers.RemoveAt(iArea);
                }
            }
        }