/// <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); } } } }
/// <summary> /// Release current area /// </summary> public void RequestReleaseCurrentArea() { if (m_CurrentAreaController != null) { m_ExpiredAreaControllers.Add(m_CurrentAreaController); m_CurrentAreaController.RequestRelease(); m_CurrentAreaController = null; } }
/// <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(); } }
/// <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})"); } } }
/// <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); } } }