/// <summary> /// Determines whether or not 'member' should be visible in the inspector /// The logic goes like this: /// If member was a method or property it is visible only if it's annotated with [Show] /// If member was a field it is visible if /// 1- it's annotated with [Show] /// 2- OR if it's serializable /// </summary> public static bool IsVisibleMember(MemberInfo member) { if (member is MethodInfo) { return(Attributes.Show.Any((t) => MemberInfoExtensions.IsDefined(member, t))); } var field = member as FieldInfo; if (field != null) { if (Attributes.Hide.Any((t) => MemberInfoExtensions.IsDefined(field, t))) { return(false); } if (Attributes.Show.Any((t) => MemberInfoExtensions.IsDefined(field, t))) { return(true); } if (field.IsDefined <SerializeField>()) { return(true); } return(IsSerializableField(field)); } var property = member as PropertyInfo; if (property == null || Attributes.Hide.Any((t) => MemberInfoExtensions.IsDefined(property, t))) { return(false); } // accept properties such as transform.position, rigidbody.mass, etc // exposing unity properties is useful when inlining objects via [Inline] // (which is the only use-case these couple of lines are meant for) var declType = property.DeclaringType; bool isValidUnityType = declType.IsA <Component>() && !declType.IsA <MonoBehaviour>(); bool unityProp = isValidUnityType && property.CanReadWrite() && !IgnoredUnityProperties.Contains(property.Name); if (unityProp) { return(true); } if (Attributes.Show.Any((t) => MemberInfoExtensions.IsDefined(property, t))) { return(true); } return(false); }