public void DoDrawGizmos(Area owner) { if (DisplayGizmos) { GizmosUtility.DrawBounds(owner.GetAABB(), AABBGizmosColor); } VoxelDebug.DoDrawGizmos(owner.VoxelGrid, owner.GetAABB()); }
public Bounds GetAABB() { if (m_Area != null) { m_AABB = m_Area.GetAABB(); } return(m_AABB); }
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); }
public void DoUpdate(Area owner) { Diameter = MathUtility.CaculateDiagonal(owner.GetAABB()); if (VoxelDebug != null && owner != null) { VoxelDebug.DoUpdate(owner.VoxelGrid, owner.gameObject); } }
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(); }