public override void OnInspectorGUI() { base.OnInspectorGUI(); Type refType = null; Obj[] targets = null; if (!serializedObject.isEditingMultipleObjects && serializedObject.targetObject != null) { refType = serializedObject.targetObject.GetType(); targets = new[] { serializedObject.targetObject }; } else if (serializedObject.targetObjects != null) { refType = TypeUtility.FindCommonTypeWithin(serializedObject.targetObjects .Select(obj => obj != null ? obj.GetType() : null) .Where(t => t != null).ToArray()); targets = serializedObject.targetObjects; } if (refType == null) { return; } var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; var members = refType.GetMembers(flags).Where(m => GetCheersAttribute(m) != null) .Union( refType.GetInterfaceHierarchy().SelectMany(i => i.GetMembers(flags)) ); foreach (var member in members.Where(m => GetCheersAttribute(m) != null)) { var attr = GetCheersAttribute(member); if (attr == null) { continue; } switch (member.MemberType) { case MemberTypes.Method: DrawMethod((MethodInfo)member, attr, targets); break; case MemberTypes.Property: DrawProperty((PropertyInfo)member, attr, targets); break; default: PrettyLog.Log("TODO...Or never to be done. >_< Just use SerializedField instead"); break; } } }