2using System.Collections;
3using System.Collections.Generic;
4using System.ComponentModel;
6using System.Reflection;
7using System.Runtime.CompilerServices;
14 public sealed
partial class Inspector
16 private class InspectorTab
18 private readonly List<ICacheEntry> _fieldCache =
new List<ICacheEntry>();
19 private readonly Stack<InspectorStackEntryBase> _inspectorStack =
new Stack<InspectorStackEntryBase>();
25 return InspectorStack.Count > 0 ? InspectorStack.Peek() :
null;
29 public IList<ICacheEntry> FieldCache
37 public Stack<InspectorStackEntryBase> InspectorStack
41 return _inspectorStack;
44 public Vector2 InspectorStackScrollPos {
get;
set; }
48 InspectorStack.Clear();
49 CacheAllMembers(
null);
55 LoadStackEntry(InspectorStack.Peek());
60 InspectorStack.Push(stackEntry);
61 LoadStackEntry(stackEntry);
64 private static IEnumerable<ICacheEntry> MethodsToCacheEntries(
object instance, Type instanceType,
65 MethodInfo[] methodsToCheck)
67 var cacheItems = methodsToCheck
68 .Where(x => !x.IsConstructor && !x.IsSpecialName && x.GetParameters().Length == 0)
69 .Where(f => !f.IsDefined(typeof(CompilerGeneratedAttribute),
false))
70 .Where(x => x.Name !=
"MemberwiseClone" && x.Name !=
"obj_address")
73 if (m.ContainsGenericParameters)
76 return m.MakeGenericMethod(instanceType);
84 }).Where(x => x !=
null)
93 var objectToOpen = entry !=
null ? entry.
Instance :
null;
94 if (objectToOpen ==
null)
return;
96 var type = objectToOpen.GetType();
101 var castedObj = objectToOpen as GameObject;
102 var list = objectToOpen as IList;
103 var enumerable = objectToOpen as IEnumerable;
107 "Navigate to GameObject this Component is attached to",
108 () =>
Inspector._treeListShowCallback(cmp.transform)));
110 else if (castedObj !=
null)
113 "Navigate to this object in the Scene Object Browser",
114 () =>
Inspector._treeListShowCallback(castedObj.transform)));
116 castedObj.transform.Cast<Transform>().ToArray()));
121 if (type == typeof(
string))
125 else if (objectToOpen is Transform)
129 else if (list !=
null)
131 for (var i = 0; i < list.Count; i++)
134 else if (enumerable !=
null)
136 _fieldCache.AddRange(enumerable.Cast<
object>()
138 .Cast<ICacheEntry>());
145 _fieldCache.AddRange(type
146 .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance |
147 BindingFlags.FlattenHierarchy)
148 .Where(f => !f.IsDefined(typeof(CompilerGeneratedAttribute),
false))
149 .Select(f =>
new FieldCacheEntry(objectToOpen, f, parent)).Cast<ICacheEntry>());
150 _fieldCache.AddRange(type
151 .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance |
152 BindingFlags.FlattenHierarchy)
153 .Where(f => !f.IsDefined(typeof(CompilerGeneratedAttribute),
false))
157 _fieldCache.AddRange(MethodsToCacheEntries(objectToOpen, type,
158 type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance |
159 BindingFlags.FlattenHierarchy)));
166 CacheStaticMembersHelper(type);
170 RuntimeUnityEditorCore.Logger.Log(
LogLevel.Warning,
"[Inspector] CacheFields crash: " + ex);
178 if (entry ==
null)
return;
187 RuntimeUnityEditorCore.Logger.Log(
LogLevel.Warning,
"[Inspector] CacheFields crash: " + ex);
191 private void CacheStaticMembersHelper(Type type)
193 _fieldCache.AddRange(type
194 .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static |
195 BindingFlags.FlattenHierarchy)
196 .Where(f => !f.IsDefined(typeof(CompilerGeneratedAttribute),
false))
198 _fieldCache.AddRange(type
199 .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static |
200 BindingFlags.FlattenHierarchy)
201 .Where(f => !f.IsDefined(typeof(CompilerGeneratedAttribute),
false))
205 _fieldCache.AddRange(MethodsToCacheEntries(
null, type,
206 type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static |
207 BindingFlags.FlattenHierarchy)));
218 if (instanceStackEntry !=
null)
220 CacheAllMembers(instanceStackEntry);
224 if (staticStackEntry !=
null)
226 CacheStaticMembers(staticStackEntry);
229 throw new InvalidEnumArgumentException(
230 "Invalid stack entry type: " + stackEntry.GetType().FullName);
235 if (CurrentStackItem == item)
return;
236 while (CurrentStackItem !=
null && CurrentStackItem != item) InspectorStack.Pop();
237 LoadStackEntry(CurrentStackItem);
UnityEngine.Component Component
RuntimeUnityEditor.Core.LogLevel LogLevel
Inspector(Action< Transform > treeListShowCallback)
void Push(InspectorStackEntryBase stackEntry, bool newTab)