114 lines
4.6 KiB
C#
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;
|
|
}
|
|
}
|