Exemple #1
0
        protected virtual void DrawSerializableMemberInfoUI(Object currentTarget, List <MemberInfo> allMembers, string label, string fieldName)
        {
            if (currentTarget == null)
            {
                return;
            }

            int memIndex = 0;
            SerializableMemberInfo targetRef = (SerializableMemberInfo)Target.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Target);

            memIndex = allMembers.IndexOf(targetRef.Info);

            if (memIndex < 0)
            {
                memIndex = 0;
            }

            var memArrayNames = allMembers.Select(x => x.Name).ToArray();
            var memArray      = allMembers.ToArray();

            memIndex = EditorGUILayout.Popup(label, memIndex, memArrayNames);

            if (memIndex < memArray.Length)
            {
                targetRef.Info = memArray[memIndex];
            }
        }
        public override void OnInspectorGUI()
        {
            Object currentTarget = (Object)Target.GetType().GetField("target", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Target);
            Object rootTarget    = (Object)Target.GetType().GetField("rootTarget", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Target);

            rootTarget = EditorGUILayout.ObjectField("Target Object", rootTarget, typeof(object), true);

            if (rootTarget as GameObject != null)
            {
                List <Object> objects = new List <Object>();
                objects = (rootTarget as GameObject).GetComponents <Component>().Cast <Object>().ToList();
                objects.Insert(0, rootTarget as GameObject);

                int tarIndex = 0;
                if (currentTarget != null)
                {
                    tarIndex = objects.Select(x => x != null ? x.GetType().Name : "null").ToList().IndexOf(currentTarget.GetType().Name);
                }

                if (tarIndex < 0)
                {
                    tarIndex = 0;
                }

                tarIndex = EditorGUILayout.Popup("Target Reference", tarIndex, objects.Select(x => x != null ? x.GetType().Name : "null").ToArray());

                currentTarget = objects[tarIndex];
            }
            else
            {
                currentTarget = rootTarget;
            }

            Target.GetType().GetField("target", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(Target, currentTarget);
            Target.GetType().GetField("rootTarget", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(Target, rootTarget);

            if (currentTarget != null)
            {
                var publicMembers    = currentTarget.GetType().GetMembers().Select(x => x);
                var nonpublicMembers = currentTarget.GetType().GetMembers(BindingFlags.NonPublic).Select(x => x);

                var allMembers    = publicMembers.Concat(nonpublicMembers).ToList();
                var allNonMethods = allMembers.Where(x => (x as MethodInfo) == null).ToList();

                int memIndex = 0;
                if (currentTarget != null)
                {
                    SerializableMemberInfo targetRef = (SerializableMemberInfo)Target.GetType().GetField("targetRef", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Target);

                    memIndex = allNonMethods.IndexOf(targetRef.Info);

                    if (memIndex < 0)
                    {
                        memIndex = 0;
                    }

                    var memArrayNames = allNonMethods.Select(x => x.Name).ToArray();
                    var memArray      = allNonMethods.ToArray();

                    memIndex = EditorGUILayout.Popup("Member", memIndex, memArrayNames);

                    if (memIndex < memArray.Length)
                    {
                        targetRef.Info = memArray[memIndex];
                    }
                }
            }
        }