Advertisement
Bunny83

SceneViewPresets.cs

Jun 7th, 2018 (edited)
1,044
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.64 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEditor;
  4.  
  5. [InitializeOnLoad]
  6. public class SceneViewPresets
  7. {
  8.     [System.Serializable]
  9.     public class Preset
  10.     {
  11.         public string name;
  12.         public Vector3 pos;
  13.         public Vector3 rot;
  14.         public Vector3 pivot;
  15.         public float size;
  16.         public bool twoD;
  17.         public bool ortho;
  18.         public bool isEditing { get; set; }
  19.         public Preset Save(SceneView aView)
  20.         {
  21.             pos = aView.camera.transform.position;
  22.             pivot = aView.pivot;
  23.             rot = aView.rotation.eulerAngles;
  24.             size = aView.size;
  25.             twoD = aView.in2DMode;
  26.             ortho = aView.orthographic;
  27.             return this;
  28.         }
  29.         public void Restore(SceneView aView)
  30.         {
  31.             aView.in2DMode = twoD;
  32.             aView.LookAt(pivot, Quaternion.Euler(rot), size, ortho);
  33.         }
  34.     }
  35.     [System.Serializable]
  36.     public class Settings
  37.     {
  38.  
  39.         public List<Preset> presets = new List<Preset>();
  40.         public bool m_ShowPresets = true;
  41.         public bool m_Expanded = false;
  42.         public Rect m_WinPos = new Rect(10, 30, m_ExpandedSize.x, m_ExpandedSize.y);
  43.         public bool showCones = true;
  44.         public bool enableMoving { get; set; }
  45.     }
  46.     static Color[] m_Colors = new Color[] {Color.red, Color.green, Color.blue, Color.cyan, Color.magenta, Color.yellow };
  47.     static string[] m_ShortNames = new string[] { "1", "2", "3", "4", "5" };
  48.     static Vector2 m_ExpandedSize = new Vector2(200, 300);
  49.     static Vector2 m_CollapsedSize = new Vector2(150, 50);
  50.     static SceneViewPresets m_Instance;
  51.     static SceneViewPresets()
  52.     {
  53.         m_Instance = new SceneViewPresets();
  54.     }
  55.     [MenuItem("Tools/B83/Toggle SceneView Presets")]
  56.     public static void ToggleControls()
  57.     {
  58.         m_Instance.settings.m_ShowPresets = !m_Instance.settings.m_ShowPresets;
  59.         SceneView.RepaintAll();
  60.     }
  61.  
  62.     public SceneViewPresets()
  63.     {
  64.         SceneView.duringSceneGui += OnSceneView;
  65.     }
  66.  
  67.     private bool m_Initialized = false;
  68.     private Vector2 m_ScrollPos;
  69.     private SceneView m_SceneView;
  70.     private GUIStyle m_ButtonWordWrap = null;
  71.     public Settings settings = new Settings();
  72.  
  73.     public void Initialize()
  74.     {
  75.         var data = EditorPrefs.GetString("B83.SceneViewPresets", "");
  76.         if (data != "")
  77.             settings = JsonUtility.FromJson<Settings>(data);
  78.         m_Initialized = true;
  79.     }
  80.     public void SaveSettings()
  81.     {
  82.         EditorPrefs.SetString("B83.SceneViewPresets", JsonUtility.ToJson(settings));
  83.     }
  84.  
  85.     void OnSceneView(SceneView aView)
  86.     {
  87.         if (!m_Initialized)
  88.             Initialize();
  89.         m_SceneView = aView;
  90.         Event e = Event.current;
  91.         GUI.skin = EditorGUIUtility.GetBuiltinSkin(EditorSkin.Scene);
  92.  
  93.         if (e.type == EventType.KeyUp  && e.alt && e.control && e.keyCode == KeyCode.P)
  94.         {
  95.             settings.m_ShowPresets = !settings.m_ShowPresets;
  96.             e.Use();
  97.         }
  98.         if (settings.m_ShowPresets)
  99.         {
  100.             var tmpRect = settings.m_WinPos;
  101.             if (settings.m_Expanded && settings.enableMoving)
  102.                 tmpRect.width += 100;
  103.             var newPos = GUI.Window(8301, tmpRect, OnWindow, "Presets");
  104.             if (newPos != tmpRect)
  105.                 SaveSettings();
  106.             settings.m_WinPos.x = Mathf.Clamp(newPos.x, 15 - newPos.width, aView.position.width-15);
  107.             settings.m_WinPos.y = Mathf.Clamp(newPos.y, 16, aView.position.height - 15);
  108.             if (settings.showCones && e.control)
  109.             {
  110.                 int colorCount = 0;
  111.                 foreach (var p in settings.presets)
  112.                 {
  113.                     var c = m_Colors[colorCount++];
  114.                     colorCount = colorCount % m_Colors.Length;
  115.                     c.a = 1f;
  116.                     Handles.color = c;
  117.                     var q = Quaternion.Euler(p.rot);
  118.                     var dir = q * Vector3.forward;
  119.                    
  120.                     q = Quaternion.LookRotation(-dir,Vector3.up);
  121.                     bool enableCone = !p.ortho && !p.twoD && (m_SceneView.camera.transform.position-p.pos).sqrMagnitude > 2;
  122.                     if (enableCone && Handles.Button(p.pos - q * Vector3.forward * 0.7f, q, 1, 0.5f, Handles.ConeHandleCap))
  123.                         p.Restore(m_SceneView);
  124.                     if (Handles.Button(p.pivot, Quaternion.identity, HandleUtility.GetHandleSize(p.pivot)*0.1f,0.25f, Handles.DotHandleCap))
  125.                         p.Restore(m_SceneView);
  126.                 }
  127.             }
  128.         }
  129.     }
  130.  
  131.     void OnWindow(int id)
  132.     {
  133.         if (m_ButtonWordWrap == null)
  134.         {
  135.             m_ButtonWordWrap = new GUIStyle("button");
  136.             m_ButtonWordWrap.wordWrap = true;
  137.         }
  138.         Event e = Event.current;
  139.         GUILayout.BeginHorizontal();
  140.         int count = Mathf.Min(m_ShortNames.Length, settings.presets.Count);
  141.         int colorCount = 0;
  142.         for (int i = 0; i < count; i++)
  143.         {
  144.             var p = settings.presets[i];
  145.             if (e.control)
  146.             {
  147.                 GUI.color = m_Colors[colorCount++];
  148.                 colorCount = colorCount % m_Colors.Length;
  149.             }
  150.  
  151.             if (GUILayout.Button(m_ShortNames[i], m_ButtonWordWrap))
  152.             {
  153.                 if (e.button == 0)
  154.                     p.Restore(m_SceneView);
  155.                 else if (e.button == 1)
  156.                     ShowContextMenu(p);
  157.             }
  158.  
  159.  
  160.         }
  161.         GUI.color = Color.white;
  162.  
  163.         //var tmp = GUILayout.Toggle(settings.m_Expanded, settings.m_Expanded ? "Collapse" : "Expand", "Button");
  164.         GUILayout.EndHorizontal();
  165.         var tmp = GUI.Toggle(new Rect(0, 0, 55, 20), settings.m_Expanded, "Expand", "Button");
  166.         if (tmp != settings.m_Expanded)
  167.         {
  168.             SetExpanded(tmp);
  169.         }
  170.         if (settings.m_Expanded)
  171.         {
  172.             m_ScrollPos = GUILayout.BeginScrollView(m_ScrollPos,GUIStyle.none, GUIStyle.none);
  173.             colorCount = 0;
  174.             for(int i = 0; i < settings.presets.Count; i++)
  175.             {
  176.                 var p = settings.presets[i];
  177.                 GUI.color = Color.white;
  178.                 GUILayout.BeginHorizontal();
  179.                 if (p.isEditing)
  180.                 {
  181.                     p.name = GUILayout.TextArea(p.name);
  182.                     if (GUILayout.Button("done", GUILayout.Width(50)))
  183.                     {
  184.                         p.isEditing = false;
  185.                         SaveSettings();
  186.                     }
  187.                     GUI.color = Color.red;
  188.                     if (GUILayout.Button("X", GUILayout.Width(20)))
  189.                     {
  190.                         settings.presets.Remove(p);
  191.                         SaveSettings();
  192.                         GUIUtility.ExitGUI();
  193.                     }
  194.                     GUI.color = Color.white;
  195.                 }
  196.                 else
  197.                 {
  198.                     if (e.control)
  199.                     {
  200.                         GUI.color = m_Colors[colorCount++];
  201.                         colorCount = colorCount % m_Colors.Length;
  202.                     }
  203.  
  204.                     if (GUILayout.Button(p.name, m_ButtonWordWrap))
  205.                     {
  206.                         if (e.button == 0)
  207.                             p.Restore(m_SceneView);
  208.                         else if (e.button == 1)
  209.                             ShowContextMenu(p);
  210.                     }
  211.                 }
  212.                 if (settings.enableMoving)
  213.                 {
  214.                     GUI.enabled = i > 0;
  215.                     if (GUILayout.Button("up", GUILayout.Width(30)))
  216.                     {
  217.                         var temp = settings.presets[i - 1];
  218.                         settings.presets[i - 1] = p;
  219.                         settings.presets[i] = temp;
  220.                         SaveSettings();
  221.                     }
  222.                     GUI.enabled = i < settings.presets.Count - 1;
  223.                     if (GUILayout.Button("down", GUILayout.Width(50)))
  224.                     {
  225.                         var temp = settings.presets[i + 1];
  226.                         settings.presets[i + 1] = p;
  227.                         settings.presets[i] = temp;
  228.                         SaveSettings();
  229.                     }
  230.                     GUI.enabled = true;
  231.                     GUI.color = Color.red;
  232.                     if (GUILayout.Button("X", GUILayout.Width(20)))
  233.                     {
  234.                         settings.presets.Remove(p);
  235.                         SaveSettings();
  236.                         GUIUtility.ExitGUI();
  237.                     }
  238.                     GUI.color = Color.white;
  239.  
  240.                 }
  241.                 GUILayout.EndHorizontal();
  242.             }
  243.             GUI.color = Color.white;
  244.             GUILayout.EndScrollView();
  245.             if (settings.showCones)
  246.                 GUILayout.Label("Hold CTRL to vizualize");
  247.             GUILayout.BeginHorizontal();
  248.             if (GUILayout.Button("New") && e.button == 0)
  249.             {
  250.                 settings.presets.Add(new Preset { name = "new", isEditing = true }.Save(m_SceneView));
  251.                 SaveSettings();
  252.             }
  253.             if (settings.enableMoving && GUILayout.Button("done editing", GUILayout.Width(120)))
  254.                 settings.enableMoving = false;
  255.             GUILayout.EndHorizontal();
  256.         }
  257.         GUI.DragWindow();
  258.     }
  259.  
  260.     void ShowContextMenu(Preset aPreset)
  261.     {
  262.         var menu = new GenericMenu();
  263.         menu.AddItem(new GUIContent("Save current position"), false, () =>
  264.         {
  265.             aPreset.Save(m_SceneView);
  266.             SaveSettings();
  267.         });
  268.         menu.AddItem(new GUIContent("Rename preset"), false, () =>
  269.         {
  270.             aPreset.isEditing = true;
  271.             SetExpanded(true);
  272.         });
  273.         menu.AddSeparator("");
  274.         menu.AddItem(new GUIContent("Edit all presets"), false, () =>
  275.         {
  276.             settings.enableMoving = true;
  277.             SetExpanded(true);
  278.         });
  279.         menu.AddItem(new GUIContent("Show camera cones"), settings.showCones, () => { settings.showCones = !settings.showCones; SaveSettings(); });
  280.         menu.AddItem(new GUIContent("Settings/Export to file"), false, () =>
  281.         {
  282.             var file = EditorUtility.SaveFilePanel("SceneViewPresetSettings", "", "SceneViewPresets", "json");
  283.             if (!string.IsNullOrEmpty(file))
  284.                 System.IO.File.WriteAllText(file, JsonUtility.ToJson(settings));
  285.         });
  286.         menu.AddItem(new GUIContent("Settings/Import from file"), false, () =>
  287.         {
  288.             var file = EditorUtility.OpenFilePanel("SceneViewPresetSettings", "", "json");
  289.             if (string.IsNullOrEmpty(file) || !System.IO.File.Exists(file))
  290.                 return;
  291.             var newSettings = JsonUtility.FromJson<Settings>(System.IO.File.ReadAllText(file));
  292.             if (newSettings == null)
  293.             {
  294.                 Debug.LogError("Settings file could not be loaded. Error in the file");
  295.                 return;
  296.             }
  297.             settings = newSettings;
  298.             SaveSettings();
  299.         });
  300.         menu.AddItem(new GUIContent("Settings/Import Presets from file (keep current presets)"), false, () =>
  301.         {
  302.             var file = EditorUtility.OpenFilePanel("SceneViewPresetSettings", "", "json");
  303.             if (string.IsNullOrEmpty(file) || !System.IO.File.Exists(file))
  304.                 return;
  305.             var newSettings = JsonUtility.FromJson<Settings>(System.IO.File.ReadAllText(file));
  306.             if (newSettings == null)
  307.             {
  308.                 Debug.LogError("Settings file could not be loaded. Error in the file");
  309.                 return;
  310.             }
  311.             settings.presets.AddRange(newSettings.presets);
  312.             SaveSettings();
  313.         });
  314.         menu.AddItem(new GUIContent("About/Created by Bunny83"), false, null);
  315.         menu.AddSeparator("About/");
  316.         menu.AddItem(new GUIContent("About/For more information see"), false, null);
  317.         menu.AddItem(new GUIContent("About/UnityAnswers"), false, () => Application.OpenURL("https://answers.unity.com/questions/1515748/how-to-save-scene-view-camera-perspectives.html"));
  318.         menu.AddSeparator("");
  319.         menu.AddItem(new GUIContent("Delete Preset"), false, () =>
  320.         {
  321.             settings.presets.Remove(aPreset);
  322.             SaveSettings();
  323.         });
  324.         menu.ShowAsContext();
  325.     }
  326.  
  327.     void SetExpanded(bool aExpanded)
  328.     {
  329.         settings.m_Expanded = aExpanded;
  330.         settings.m_WinPos.size = aExpanded? m_ExpandedSize : m_CollapsedSize;
  331.         SaveSettings();
  332.     }
  333. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement