Exemple #1
0
        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();
        }
Exemple #2
0
        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);
            }
        }