Add prototype gameplay loop with character/battlefield assets and server game APIs.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user