public void Show() { InstanceStackEntry entry = new InstanceStackEntry(obj, name); RuntimeUnityEditor.Bepin5.RuntimeUnityEditor5.Instance.Inspector.Push(entry, true); RuntimeUnityEditor.Bepin5.RuntimeUnityEditor5.Instance.Show = true; }
private void CacheAllMembers(InstanceStackEntry entry) { _fieldCache.Clear(); var objectToOpen = entry?.Instance; if (objectToOpen == null) { return; } var type = objectToOpen.GetType(); try { if (objectToOpen is Component cmp) { _fieldCache.Add(new CallbackCacheEntry("Open in Scene Object Browser", "Navigate to GameObject this Component is attached to", () => Inspector._treeListShowCallback(cmp.transform))); } else if (objectToOpen is GameObject castedObj) { _fieldCache.Add(new CallbackCacheEntry("Open in Scene Object Browser", "Navigate to this object in the Scene Object Browser", () => Inspector._treeListShowCallback(castedObj.transform))); _fieldCache.Add(new ReadonlyCacheEntry("Child objects", castedObj.transform.Cast <Transform>().ToArray())); _fieldCache.Add(new ReadonlyCacheEntry("Components", castedObj.GetComponents <Component>())); } // If we somehow enter a string, this allows user to see what the string actually says if (type == typeof(string)) { _fieldCache.Add(new ReadonlyCacheEntry("this", objectToOpen)); } else if (objectToOpen is Transform) { // Prevent the list overloads from listing subcomponents } else if (objectToOpen is IList list) { for (var i = 0; i < list.Count; i++) { _fieldCache.Add(new ListCacheEntry(list, i)); } } else if (objectToOpen is IEnumerable enumerable) { _fieldCache.AddRange(enumerable.Cast <object>() .Select((x, y) => x is ICacheEntry ? x : new ReadonlyListCacheEntry(x, y)) .Cast <ICacheEntry>()); } // No need if it's not a value type, only used to propagate changes back so it's redundant with classes var parent = entry.Parent?.Type().IsValueType == true ? entry.Parent : null; // Instance members _fieldCache.AddRange(type.GetAllFields(false) .Where(f => !f.IsDefined(typeof(CompilerGeneratedAttribute), false)) .Select(f => new FieldCacheEntry(objectToOpen, f, parent)).Cast <ICacheEntry>()); _fieldCache.AddRange(type.GetAllProperties(false) .Where(f => !f.IsDefined(typeof(CompilerGeneratedAttribute), false)) .Select(p => new PropertyCacheEntry(objectToOpen, p, parent)).Cast <ICacheEntry>()); _fieldCache.AddRange(MethodsToCacheEntries(objectToOpen, type, type.GetAllMethods(false))); CacheStaticMembersHelper(type); } catch (Exception ex) { RuntimeUnityEditorCore.Logger.Log(LogLevel.Warning, "[Inspector] CacheFields crash: " + ex); } }