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();
}
}