Пример #1
0
 public void DoDrawGizmos(Area owner)
 {
     if (DisplayGizmos)
     {
         GizmosUtility.DrawBounds(owner.GetAABB(), AABBGizmosColor);
     }
     VoxelDebug.DoDrawGizmos(owner.VoxelGrid, owner.GetAABB());
 }
Пример #2
0
 public Bounds GetAABB()
 {
     if (m_Area != null)
     {
         m_AABB = m_Area.GetAABB();
     }
     return(m_AABB);
 }
Пример #3
0
        public void Create(Map map, Area area = null, ulong areaId = 0)
        {
            m_Map = map;
            if (area != null)
            {
                m_Area     = area;
                m_AABB     = m_Area.GetAABB();
                VoxelGrid  = m_Area.VoxelGrid;
                m_Diameter = m_Area.GetDiameter();
            }
            else
            {
                GameObject areaObj = new GameObject(string.Format("Area_{0}", areaId));
                m_Area     = areaObj.AddComponent <Area>();
                m_Area.Uid = areaId;
            }
            m_AreaUid       = m_Area.Uid;
            m_AreaScenePath = string.Format("{0}/Area_{1}_{2}.unity", m_Map.GetOwnerAreaPath(), m_Map.Uid, m_AreaUid);
            gameObject.name = string.Format("AreaSpawner_{0}_{1}", m_Map.Uid, m_AreaUid);
            Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Additive);

            if (scene != null)
            {
                SceneManager.MoveGameObjectToScene(m_Area.gameObject, scene);
                SceneManager.SetActiveScene(scene);
                EditorSceneManager.SaveScene(scene, m_AreaScenePath);
                EditorSceneManager.UnloadSceneAsync(scene);
            }
            EditorSceneManager.CloseScene(scene, true);
        }
Пример #4
0
 public void DoUpdate(Area owner)
 {
     Diameter = MathUtility.CaculateDiagonal(owner.GetAABB());
     if (VoxelDebug != null && owner != null)
     {
         VoxelDebug.DoUpdate(owner.VoxelGrid, owner.gameObject);
     }
 }
Пример #5
0
        private IEnumerator DoAnalyzeArea(Map map, AreaSpawner areaSpawner, bool showDialog = true)
        {
            string areaName   = areaSpawner.GetAreaScenePath();
            Area   exportArea = null;
            Scene  areaScene  = EditorSceneManager.OpenScene(areaName, OpenSceneMode.Additive);

            if (areaScene != null)
            {
                SceneManager.SetActiveScene(areaScene);
                GameObject[] rootObjArray = areaScene.GetRootGameObjects();
                if (rootObjArray != null && rootObjArray.Length > 0)
                {
                    for (int index = 0; index < rootObjArray.Length; index++)
                    {
                        SceneManager.MoveGameObjectToScene(rootObjArray[index], map.GetOwnerScene());
                        Area area = rootObjArray[index].GetComponent <Area>();
                        if (area != null)
                        {
                            exportArea = area;
                        }
                    }
                }
                EditorSceneManager.CloseScene(areaScene, true);
            }
            yield return(null);

            if (exportArea != null)
            {
                areaSpawner.SetArea(exportArea);
                IEnumerator areaSpawnerEnumerator = areaSpawner.DoUpdate(map, true);
                while (areaSpawnerEnumerator.MoveNext())
                {
                    yield return(null);
                }
                //TODO: 1、计算area的直径  2、计算所有unit的直径 3、算出推荐格子大小 对应层AABB范围
                //如果大于等于Area直径的90%以上的unit数量大于0 算一个层
                Bounds areaAABB        = exportArea.GetAABB();
                float  areaDiameter    = Mathf.Max(areaAABB.size.x, areaAABB.size.y, areaAABB.size.z);
                float  consultDiameter = areaDiameter * 0.9f;
                CalcuateLayer(map, exportArea, areaDiameter);
                EditorUtility.SetDirty(m_EditorSplitAreaSetting);
                GameObject.DestroyImmediate(exportArea.gameObject);
            }
            EditorUtility.ClearProgressBar();
            if (showDialog)
            {
                EditorUtility.DisplayDialog("Analyze", "分析成功", "OK");
            }
            AssetDatabase.Refresh();
        }