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]; } } } }