using System; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; [ExecuteInEditMode] public class IsoEditor : MonoBehaviour { public Camera IsoCamera; private bool hasEvents = false; private void OnEnable() { EnableButtons(); } public float IsoAngle { get { return IsoCamera.transform.localEulerAngles.x; } } public float IsoAspect { get { return Mathf.Cos(Mathf.PI / 2.0f - Mathf.Deg2Rad * IsoAngle); } } public static readonly float HSqrt2 = Mathf.Sqrt(2) / 2.0f; public Vector2 IsoProject(Vector3 pos) { return new Vector2((pos.x + pos.z) * HSqrt2, ((-pos.x + pos.z) * IsoAspect + pos.y) * HSqrt2); } private void OnDisable() { DisableButtons(); } // Update is called once per frame void Update () { if (isoMode) { foreach (SceneView sv in SceneView.sceneViews) { sv.rotation = IsoCamera.transform.rotation; } } } private bool isoMode = false; public bool IsoMode { get { return isoMode; } } private Vector3 lastCameraP; private Quaternion lastCameraQ; private bool lastOrtho; public void EnableButtons() { SceneView.onSceneGUIDelegate -= OnSceneGUI; SceneView.onSceneGUIDelegate += OnSceneGUI; SceneView.RepaintAll(); } public void DisableButtons() { SceneView.onSceneGUIDelegate -= OnSceneGUI; SceneView.RepaintAll(); } private struct SaveScene { public Vector3 P; public Quaternion Q; public bool O; } private Dictionary<SceneView, SaveScene> saved = new Dictionary<SceneView, SaveScene>(); public void OnSceneGUI(SceneView sceneView) { Handles.BeginGUI(); if (GUI.Button(new Rect(5, 5, 100, 20), "ISO Mode " + (isoMode ? "On" : "Off"))) { isoMode = !isoMode; if (isoMode) { saved.Clear(); } foreach (SceneView sv in SceneView.sceneViews) { if (isoMode) { saved[sv] = new SaveScene { P = sv.pivot, Q = sv.rotation, O = sv.orthographic }; sv.AlignViewToObject(IsoCamera.transform); sv.orthographic = true; sv.isRotationLocked = true; } else { if (saved.ContainsKey(sv)) { sv.pivot = saved[sv].P; sv.rotation = saved[sv].Q; sv.orthographic = saved[sv].O; } sv.isRotationLocked = false; } } } Handles.EndGUI(); } }