Tanoda
RuntimeUnityEditorCore.cs
Go to the documentation of this file.
1using System;
2using System.Collections;
3using System.IO;
8using UnityEngine;
9
11{
13 {
14 public const string Version = "2.0.1";
15 public const string GUID = "RuntimeUnityEditor";
16
17 public Inspector.Inspector Inspector { get; private set; }
18 public ObjectTreeViewer TreeViewer { get; private set; }
19
20 public event EventHandler SettingsChanged;
21
22 public KeyCode ShowHotkey
23 {
24 get
25 {
26 return _showHotkey;
27 }
28
29 set
30 {
31 if (_showHotkey != value)
32 {
33 _showHotkey = value;
34 if(SettingsChanged != null) SettingsChanged.Invoke(this, EventArgs.Empty);
35 }
36 }
37 }
38
39 public bool ShowInspector
40 {
41 get
42 {
43 return Inspector != null && Inspector.Show;
44 }
45
46 set
47 {
48 if (Inspector != null && Inspector.Show != value)
49 {
50 Inspector.Show = value;
51 if(SettingsChanged != null) SettingsChanged.Invoke(this, EventArgs.Empty);
52 }
53 }
54 }
55
56 internal static RuntimeUnityEditorCore Instance { get; private set; }
57 internal static MonoBehaviour PluginObject { get; private set; }
58 internal static ILoggerWrapper Logger { get; private set; }
59
60 private readonly GizmoDrawer _gizmoDrawer;
61 private readonly GameObjectSearcher _gameObjectSearcher = new GameObjectSearcher();
62
63 private CursorLockMode _previousCursorLockState;
64 private bool _previousCursorVisible;
65 private KeyCode _showHotkey = KeyCode.F9;
66
67 internal RuntimeUnityEditorCore(MonoBehaviour pluginObject, ILoggerWrapper logger, string configPath)
68 {
69 if (Instance != null)
70 throw new InvalidOperationException("Can only create one instance of the Core object");
71
72 PluginObject = pluginObject;
73 Logger = logger;
74 Instance = this;
75
76 Inspector = new Inspector.Inspector(targetTransform => TreeViewer.SelectAndShowObject(targetTransform));
77
78 TreeViewer = new ObjectTreeViewer(pluginObject, _gameObjectSearcher);
79 TreeViewer.InspectorOpenCallback = items =>
80 {
81 for (var i = 0; i < items.Length; i++)
82 {
83 var stackEntry = items[i];
84 Inspector.Push(stackEntry, i == 0);
85 }
86 };
87
88 if (UnityFeatureHelper.SupportsVectrosity)
89 {
90 _gizmoDrawer = new GizmoDrawer(pluginObject);
91 TreeViewer.TreeSelectionChangedCallback = transform => _gizmoDrawer.UpdateState(transform);
92 }
93 }
94
95 internal void OnGUI()
96 {
97 if (Show)
98 {
99 var originalSkin = GUI.skin;
100 GUI.skin = InterfaceMaker.CustomSkin;
101
102 Cursor.lockState = CursorLockMode.None;
103 Cursor.visible = true;
104
105 Inspector.DisplayInspector();
107
108 // Restore old skin for maximum compatibility
109 GUI.skin = originalSkin;
110 }
111 }
112
113 public bool Show
114 {
115 get
116 {
117 return TreeViewer.Enabled;
118 }
119
120 set
121 {
122 if (Show != value)
123 {
124 if (value)
125 {
126 _previousCursorLockState = Cursor.lockState;
127 _previousCursorVisible = Cursor.visible;
128 }
129 else
130 {
131 if (!_previousCursorVisible || _previousCursorLockState != CursorLockMode.None)
132 {
133 Cursor.lockState = _previousCursorLockState;
134 Cursor.visible = _previousCursorVisible;
135 }
136 }
137 }
138
139 TreeViewer.Enabled = value;
140
141 if (_gizmoDrawer != null)
142 {
143 _gizmoDrawer.Show = value;
144 _gizmoDrawer.UpdateState(TreeViewer.SelectedTransform);
145 }
146
147 if (value)
148 {
149 SetWindowSizes();
150
151 RefreshGameObjectSearcher(true);
152 }
153 }
154 }
155
156 internal void Update()
157 {
158 if (Input.GetKeyDown(ShowHotkey))
159 Show = !Show;
160
161 if (Show)
162 {
163 RefreshGameObjectSearcher(false);
164
165 Cursor.lockState = CursorLockMode.None;
166 Cursor.visible = true;
167 }
168 }
169
170 internal void LateUpdate()
171 {
172 if (Show)
173 {
174 Cursor.lockState = CursorLockMode.None;
175 Cursor.visible = true;
176 }
177 }
178
179 private void RefreshGameObjectSearcher(bool full)
180 {
181 var gizmosExist = _gizmoDrawer != null && _gizmoDrawer.Lines.Count > 0;
182 _gameObjectSearcher.Refresh(full, gizmosExist ? GizmoFilter : (Predicate<GameObject>)null);
183 }
184
185 private bool GizmoFilter(GameObject o)
186 {
187 return o.name.StartsWith(GizmoDrawer.GizmoObjectName);
188 }
189
190 private void SetWindowSizes()
191 {
192 const int screenOffset = 10;
193
194 var screenRect = new Rect(
195 screenOffset,
196 screenOffset,
197 Screen.width - screenOffset * 2,
198 Screen.height - screenOffset * 2);
199
200 var centerWidth = (int)Mathf.Min(850, screenRect.width);
201 var centerX = (int)(screenRect.xMin + screenRect.width / 2 - Mathf.RoundToInt((float)centerWidth / 2));
202
203 var inspectorHeight = (int)(screenRect.height / 4) * 3;
204 Inspector.UpdateWindowSize(new Rect(
205 centerX,
206 screenRect.yMin,
207 centerWidth,
208 inspectorHeight));
209
210 var rightWidth = 350;
211 var treeViewHeight = screenRect.height;
213 screenRect.xMax - rightWidth,
214 screenRect.yMin,
215 rightWidth,
216 treeViewHeight));
217 }
218 }
219}
Keeps track of root gameobjects and allows searching objects in the scene