Files

114 lines
4.6 KiB
C#

using System.Collections.Generic;
using System.Text;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;
/// <summary>Temporary edit-mode view of PrototypeArena through BattleCamera. Does not save.</summary>
public static class PreviewBattleFraming
{
const string Arena = "Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab";
static readonly List<GameObject> Hidden = new List<GameObject>();
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<GameObject>(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<Camera>();
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<Renderer>().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<Renderer>(true);
int visible = 0;
var materials = new HashSet<Material>();
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;
}
}