using System.Collections.Generic; using System.Text; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement; /// Temporary edit-mode view of PrototypeArena through BattleCamera. Does not save. public static class PreviewBattleFraming { const string Arena = "Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab"; static readonly List Hidden = new List(); static Scene Preview; public static string Show() { Close(); for (int i = 0; i < SceneManager.sceneCount; i++) { var scene = SceneManager.GetSceneAt(i); foreach (var root in scene.GetRootGameObjects()) { if (!root.activeSelf) continue; root.SetActive(false); Hidden.Add(root); } } Preview = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Additive); var prefab = AssetDatabase.LoadAssetAtPath(Arena); var arena = (GameObject)PrefabUtility.InstantiatePrefab(prefab); SceneManager.MoveGameObjectToScene(arena, Preview); EditorSceneManager.SetActiveScene(Preview); for (int lane = 0; lane < 3; lane++) { float x = lane == 0 ? 0 : lane == 1 ? -3f : 3f; var hero = arena.transform.Find("Heroes/Hero" + lane); hero.gameObject.SetActive(true); hero.localPosition = new Vector3(x, 0, 0); var enemy = arena.transform.Find("Enemies/Enemy" + lane); enemy.gameObject.SetActive(true); enemy.localPosition = new Vector3(x, 0, 8); } var camera = arena.transform.Find("BattleCamera").GetComponent(); var view = SceneView.lastActiveSceneView; if (view == null) throw new System.Exception("No Scene View."); view.orthographic = camera.orthographic; view.LookAt(camera.transform.position + camera.transform.forward * 12f, camera.transform.rotation, camera.orthographicSize); view.camera.orthographic = camera.orthographic; view.camera.orthographicSize = camera.orthographicSize; view.Repaint(); var ground = arena.transform.Find("Greenfield/Ground/GroundMesh").GetComponentInChildren().bounds; return "cameraPos=" + camera.transform.position + " ortho=" + camera.orthographicSize + " ground=" + ground.size + " center=" + ground.center; } public static string Measure() { GameObject arena = null; for (int i = 0; i < SceneManager.sceneCount; i++) { foreach (var root in SceneManager.GetSceneAt(i).GetRootGameObjects()) if (root.name.Contains("PrototypeArena")) arena = root; } if (arena == null) throw new System.Exception("Battle preview is not open."); var renderers = arena.GetComponentsInChildren(true); int visible = 0; var materials = new HashSet(); foreach (var renderer in renderers) { if (!renderer.enabled || !renderer.gameObject.activeInHierarchy) continue; visible++; foreach (var material in renderer.sharedMaterials) if (material != null) materials.Add(material); } return "visibleRenderers=" + visible + " materials=" + materials.Count; } public static string Status() { var report = new StringBuilder(); for (int i = 0; i < SceneManager.sceneCount; i++) { var scene = SceneManager.GetSceneAt(i); report.Append(scene.name).Append(" path=").Append(scene.path).Append(" ["); foreach (var root in scene.GetRootGameObjects()) report.Append(root.name).Append(root.activeSelf ? "" : "(off)").Append(","); report.Append("] "); } return report.ToString(); } public static string Close() { var closed = new StringBuilder(); for (int i = SceneManager.sceneCount - 1; i >= 0; i--) { var scene = SceneManager.GetSceneAt(i); if (!string.IsNullOrEmpty(scene.path)) continue; EditorSceneManager.CloseScene(scene, true); closed.Append(scene.name).Append(";"); } int restored = 0; for (int i = 0; i < SceneManager.sceneCount; i++) { foreach (var root in SceneManager.GetSceneAt(i).GetRootGameObjects()) { if (root.activeSelf) continue; root.SetActive(true); restored++; } } Preview = default; Hidden.Clear(); return "closed=" + closed + " restored=" + restored; } }