コード例 #1
0
 /// <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;
     }
 }
コード例 #2
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));
        }
コード例 #3
0
        /// <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();
            }
        }
コード例 #4
0
 //------------------------------------------------------------------------/
 // CTOR
 //------------------------------------------------------------------------/
 public MemberField()
 {
     this.member = new UnityMember();
 }
コード例 #5
0
 /// <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;
     }
 }
コード例 #6
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);
        }
コード例 #7
0
 //------------------------------------------------------------------------/
 // CTOR
 //------------------------------------------------------------------------/
 public StratusMemberField()
 {
     this.member = new UnityMember();
 }