Exemple #1
0
        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);
                }
            }