void DrawUI() { if (m_EditorSplitAreaSetting == null) { return; } GUILayout.BeginHorizontal(); if (GUILayout.Button("开始拆解区域", GUILayout.Height(50))) { if (m_ExportData == null) { EditorUtility.DisplayDialog("拆解区域", "拆解失败!拆解数据为空", "OK"); return; } Map map = m_ExportData.m_Map; List <AreaSpawner> areaSpawners = m_ExportData.m_AreaSpawners; new Exporter().BeginExport(map, map.ExportSetting, m_ExportData.m_ExportParameter, m_ExportData.m_AreaSpawners); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Analyze", GUILayout.Height(50))) { if (m_ExportData == null) { EditorUtility.DisplayDialog("Analyze", "Analyze失败!拆解数据为空", "OK"); return; } Map map = m_ExportData.m_Map; new AnalyzeArea().Start(map, m_ExportData.m_AreaSpawners[0]); } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("层名字", GUILayout.Width(200))) { } if (GUILayout.Button("优先级", GUILayout.Width(80))) { } if (GUILayout.Button("虚拟格子大小", GUILayout.Width(100))) { } if (GUILayout.Button("物件AABB MIN", GUILayout.Width(150))) { } if (GUILayout.Button("物件AABB MAX", GUILayout.Width(150))) { } if (GUILayout.Button("偏移", GUILayout.Width(150))) { } GUILayout.Label("屏幕占比:", GUILayout.MaxWidth(80)); m_EditorSplitAreaSetting.m_Rate = EditorGUILayout.FloatField(m_EditorSplitAreaSetting.m_Rate, GUILayout.MaxWidth(100)); GUILayout.EndHorizontal(); GUILayout.BeginVertical(); m_ScrollPos = EditorGUILayout.BeginScrollView(m_ScrollPos); if (m_EditorSplitAreaLayerSettings != null) { for (int iLayer = m_EditorSplitAreaLayerSettings.Count - 1; iLayer >= 0; iLayer--) { EditorSplitAreaLayerSetting layerInfo = m_EditorSplitAreaLayerSettings[iLayer]; GUILayout.BeginHorizontal(); layerInfo.m_LayerName = GUILayout.TextField(layerInfo.m_LayerName, GUILayout.MaxWidth(200)); layerInfo.m_Priority = EditorGUILayout.IntField(layerInfo.m_Priority, GUILayout.MaxWidth(80)); layerInfo.m_GridSize = EditorGUILayout.IntField(layerInfo.m_GridSize, GUILayout.MaxWidth(100)); layerInfo.m_MinAABBSize = EditorGUILayout.FloatField(layerInfo.m_MinAABBSize, GUILayout.MaxWidth(150)); layerInfo.m_MaxAABBSize = EditorGUILayout.FloatField(layerInfo.m_MaxAABBSize, GUILayout.MaxWidth(150)); layerInfo.m_Offest = (int)(GridOffest)EditorGUILayout.EnumPopup((GridOffest)layerInfo.m_Offest, GUILayout.MaxWidth(150)); if (GUILayout.Button("删除")) { m_EditorSplitAreaLayerSettings.Remove(layerInfo); } GUILayout.EndHorizontal(); } } GUILayout.EndScrollView(); GUILayout.BeginHorizontal(); //添加层 m_Name = EditorGUILayout.TextField(m_Name, GUILayout.MaxWidth(200)); m_Priority = EditorGUILayout.IntField(m_Priority, GUILayout.MaxWidth(80)); m_Size = EditorGUILayout.IntField(m_Size, GUILayout.MaxWidth(50)); m_MinAABB = EditorGUILayout.FloatField(m_MinAABB, GUILayout.MaxWidth(150)); m_MaxAABB = EditorGUILayout.FloatField(m_MaxAABB, GUILayout.MaxWidth(150)); m_GridOffest = (int)(GridOffest)EditorGUILayout.EnumPopup((GridOffest)m_GridOffest, GUILayout.MaxWidth(150)); if (GUILayout.Button("添加", GUILayout.MaxWidth(100))) { EditorSplitAreaLayerSetting layerInfo = new EditorSplitAreaLayerSetting(); layerInfo.m_MaxAABBSize = m_MaxAABB; layerInfo.m_MinAABBSize = m_MinAABB; layerInfo.m_LayerName = m_Name; layerInfo.m_Priority = m_Priority; layerInfo.m_GridSize = m_Size; layerInfo.m_Offest = m_GridOffest; m_EditorSplitAreaLayerSettings.Add(layerInfo); } GUILayout.EndHorizontal(); GUILayout.EndVertical(); }
private void CalcuateLayer(Map map, Area exportArea, float areaDiameter) { Dictionary <int, UnitInfo> unitInfos = new Dictionary <int, UnitInfo>(); CalcuateAllPrefab(exportArea.gameObject, unitInfos); List <GameObject> unitObjs = new List <GameObject>(); foreach (var unitInfo in unitInfos) { unitObjs.Add(unitInfo.Value.Unit); } if (unitObjs != null && unitObjs.Count > 0) { float totalDiameter = 0f; unitObjs.Sort((unit1, unit2) => { UnitInfo info1 = unitInfos[unit1.GetInstanceID()]; UnitInfo info2 = unitInfos[unit2.GetInstanceID()]; Bounds unit1AABB = info1.AABB; float unit1Diameter = Mathf.Max(unit1AABB.size.x, unit1AABB.size.y, unit1AABB.size.z); Bounds unit2AABB = info2.AABB; float unit2Diameter = Mathf.Max(unit2AABB.size.x, unit2AABB.size.y, unit2AABB.size.z); return(unit1Diameter.CompareTo(unit2Diameter)); }); for (int iUnit = 0; iUnit < unitObjs.Count; iUnit++) { GameObject unit = unitObjs[iUnit]; UnitInfo unitInfo = unitInfos[unit.GetInstanceID()]; Bounds unitAABB = unitInfo.AABB; EditorUtility.DisplayProgressBar("analyze", unit.name, iUnit / unitObjs.Count); float unitDiameter = Mathf.Max(unitAABB.size.x, unitAABB.size.y, unitAABB.size.z); totalDiameter += unitDiameter; } m_EditorSplitAreaLayerSettings.Clear(); float avergeDiameter = totalDiameter / unitObjs.Count; EditorSplitAreaLayerSetting layerInfo = new EditorSplitAreaLayerSetting(); layerInfo.m_MaxAABBSize = areaDiameter; layerInfo.m_MinAABBSize = avergeDiameter; layerInfo.m_LayerName = AreaLayer.BigLayer.ToString(); layerInfo.m_Priority = (int)AreaLayer.BigLayer; layerInfo.m_GridSize = Mathf.Max(Mathf.CeilToInt(areaDiameter), 1); float avergeHalfDiameter = avergeDiameter / 3; float halfDiameter = avergeDiameter - 2 * avergeHalfDiameter; EditorSplitAreaLayerSetting layerInfoMedium = new EditorSplitAreaLayerSetting(); layerInfoMedium.m_MaxAABBSize = avergeDiameter; layerInfoMedium.m_MinAABBSize = halfDiameter; layerInfoMedium.m_LayerName = AreaLayer.MediumLayer.ToString(); layerInfoMedium.m_Priority = (int)AreaLayer.MediumLayer; layerInfoMedium.m_GridSize = Mathf.Max(Mathf.CeilToInt(avergeDiameter), 1); EditorSplitAreaLayerSetting layerInfoSmall = new EditorSplitAreaLayerSetting(); layerInfoSmall.m_MaxAABBSize = halfDiameter; layerInfoSmall.m_MinAABBSize = 0; layerInfoSmall.m_LayerName = AreaLayer.SmallLayer.ToString(); layerInfoSmall.m_Priority = (int)AreaLayer.SmallLayer; layerInfoSmall.m_GridSize = Mathf.Max(Mathf.CeilToInt(halfDiameter), 1); float layer1MaxDiameter = -1f; //层1中的unit最大直径 float layer2MaxDiameter = -1f; //层2中的unit最大直径 float layer3MaxDiameter = -1f; //层3中的unit最大直径 //TODO:计算27宫格偏移 for (int iUnit = 0; iUnit < unitObjs.Count; iUnit++) { GameObject unit = unitObjs[iUnit]; Bounds unitAABB = unitInfos[unit.GetInstanceID()].AABB; EditorUtility.DisplayProgressBar("analyze", unit.name, iUnit / unitObjs.Count); float unitDiameter = Mathf.Max(unitAABB.size.x, unitAABB.size.y, unitAABB.size.z); if (unitDiameter > avergeDiameter && unitDiameter <= areaDiameter)//big layer { if (layer1MaxDiameter < unitDiameter) { layer1MaxDiameter = unitDiameter; } } else if (unitDiameter > halfDiameter && unitDiameter <= avergeDiameter)//medium layer { if (layer2MaxDiameter < unitDiameter) { layer2MaxDiameter = unitDiameter; } } else if (unitDiameter > 0 && unitDiameter <= halfDiameter)//small layer { if (layer3MaxDiameter < unitDiameter) { layer3MaxDiameter = unitDiameter; } } } float halfTanCameraFov = RendererUtility.CaculateHalfTanCameraFov(map.ExpectedFov); float toCameraDistance = RendererUtility.CacluateToCameraDistance(layer1MaxDiameter, m_EditorSplitAreaSetting.m_Rate, halfTanCameraFov); toCameraDistance = Mathf.Min(toCameraDistance, exportArea.GetDiameter()); layerInfo.m_Offest = Mathf.Clamp(Mathf.CeilToInt(toCameraDistance / layerInfo.m_GridSize), (int)GridOffest.Min, (int)GridOffest.Max); toCameraDistance = RendererUtility.CacluateToCameraDistance(layer2MaxDiameter, m_EditorSplitAreaSetting.m_Rate, halfTanCameraFov); layerInfoMedium.m_Offest = Mathf.Clamp(Mathf.CeilToInt(toCameraDistance / layerInfoMedium.m_GridSize), (int)GridOffest.Min, (int)GridOffest.Max); toCameraDistance = RendererUtility.CacluateToCameraDistance(layer3MaxDiameter, m_EditorSplitAreaSetting.m_Rate, halfTanCameraFov); layerInfoSmall.m_Offest = Mathf.Clamp(Mathf.CeilToInt(toCameraDistance / layerInfoSmall.m_GridSize), (int)GridOffest.Min, (int)GridOffest.Max); m_EditorSplitAreaLayerSettings.Add(layerInfo); m_EditorSplitAreaLayerSettings.Add(layerInfoMedium); m_EditorSplitAreaLayerSettings.Add(layerInfoSmall); } }