/// <summary> /// Assigns the property values from a specified member. /// </summary> protected virtual void SetValue(UnityMember value) { if (value != null) { componentProperty.stringValue = value.component; nameProperty.stringValue = value.name; UnityMemberDrawerHelper.SerializeParameterTypes(parameterTypesProperty, value.parameterTypes); } else { componentProperty.stringValue = null; nameProperty.stringValue = null; parameterTypesProperty.arraySize = 0; } }
protected DropdownOption <UnityMember> GetMemberOption(MemberInfo member, string component, bool inherited) { UnityMember value; string label; if (member is FieldInfo) { FieldInfo field = (FieldInfo)member; value = new UnityMember(component, field.Name); label = string.Format(labelTypeAfter ? "{1} : {0}" : "{0} {1}", field.FieldType.PrettyName(), field.Name); } else if (member is PropertyInfo) { PropertyInfo property = (PropertyInfo)member; value = new UnityMember(component, property.Name); label = string.Format(labelTypeAfter ? "{1} : {0}" : "{0} {1}", property.PropertyType.PrettyName(), property.Name); } else if (member is MethodInfo) { MethodInfo method = (MethodInfo)member; ParameterInfo[] parameters = method.GetParameters(); value = new UnityMember(component, member.Name, parameters.Select(p => p.ParameterType).ToArray()); string parameterString = string.Join(", ", parameters.Select(p => p.ParameterType.PrettyName()).ToArray()); label = string.Format(labelTypeAfter ? "{1} ({2}) : {0}" : "{0} {1} ({2})", method.ReturnType.PrettyName(), member.Name, parameterString); } else { throw new UnityReflectionException(); } if (inherited) { label = "(Inherited)/" + label; } return(new DropdownOption <UnityMember>(value, label)); }
/// <inheritdoc /> protected override void RenderMemberControl(Rect position) { // Other Targets // Some Unity Objects, like Assets, are not supported by the drawer. // Just display an error message to let the user change their target. if (targetType == UnityObjectType.Other) { EditorGUI.HelpBox(position, "Unsupported Unity Object type.", MessageType.None); return; } // Display a list of all available reflected members in a popup. UnityMember value = GetValue(); DropdownOption <UnityMember> selectedOption = null; if (value != null) { if (targetType == UnityObjectType.GameObject) { string label; if (value.component == null) { label = string.Format("GameObject.{0}", value.name); } else { label = string.Format("{0}.{1}", value.component, value.name); } // There seems to be no way of differentiating between null parameter types // (fields, properties and implicitly typed methods) and zero parameter types // because Unity's serialized property array cannot be assigned to null, only // given an array size of zero. // TODO: The solution would be to use a single comma-separated // string instead of an array of strings, which we could differentiate manually. if (value.parameterTypes != null && value.parameterTypes.Length > 0) { string parameterString = string.Join(", ", value.parameterTypes.Select(t => t.PrettyName()).ToArray()); label += string.Format(" ({0})", parameterString); } selectedOption = new DropdownOption <UnityMember>(value, label); } else if (targetType == UnityObjectType.ScriptableObject) { selectedOption = new DropdownOption <UnityMember>(value, value.name); } } bool enabled = targetType != UnityObjectType.None; if (!enabled) { EditorGUI.BeginDisabledGroup(true); } EditorGUI.BeginChangeCheck(); EditorGUI.showMixedValue = nameProperty.hasMultipleDifferentValues; value = DropdownGUI <UnityMember> .PopupSingle ( position, GetAllMemberOptions, selectedOption, new DropdownOption <UnityMember>(null, string.Format("Nothing")) ); EditorGUI.showMixedValue = false; if (EditorGUI.EndChangeCheck()) { SetValue(value); } if (!enabled) { EditorGUI.EndDisabledGroup(); } }
//------------------------------------------------------------------------/ // CTOR //------------------------------------------------------------------------/ public MemberField() { this.member = new UnityMember(); }
protected DropdownOption<UnityMember> GetMemberOption(MemberInfo member, string component, bool inherited) { UnityMember value; string label; if (member is FieldInfo) { FieldInfo field = (FieldInfo)member; value = new UnityMember(component, field.Name); label = string.Format(labelTypeAfter ? "{1} : {0}" : "{0} {1}", field.FieldType.PrettyName(), field.Name); } else if (member is PropertyInfo) { PropertyInfo property = (PropertyInfo)member; value = new UnityMember(component, property.Name); label = string.Format(labelTypeAfter ? "{1} : {0}" : "{0} {1}", property.PropertyType.PrettyName(), property.Name); } else if (member is MethodInfo) { MethodInfo method = (MethodInfo)member; ParameterInfo[] parameters = method.GetParameters(); value = new UnityMember(component, member.Name, parameters.Select(p => p.ParameterType).ToArray()); string parameterString = string.Join(", ", parameters.Select(p => p.ParameterType.PrettyName()).ToArray()); label = string.Format(labelTypeAfter ? "{1} ({2}) : {0}" : "{0} {1} ({2})", method.ReturnType.PrettyName(), member.Name, parameterString); } else { throw new UnityReflectionException(); } if (inherited) { label = "(Inherited)/" + label; } return new DropdownOption<UnityMember>(value, label); }
//------------------------------------------------------------------------/ // CTOR //------------------------------------------------------------------------/ public StratusMemberField() { this.member = new UnityMember(); }