private bool CanAutoPopulate(SerializedProperty property, AutoPopulateAttribute autoPopulate) { if (autoPopulate == null) { return(false); } if (property.isArray) { return(false); // Disable array support for now, // Unity doesn't call the drawer for the array, it calls it for the elements in the array :( } if (property.propertyPath.EndsWith("]")) { return(false); // as above, we use the ] char as a sign that Unity is trying to edit an array element } if (property.propertyType == SerializedPropertyType.ObjectReference) { return(true); } if (AutoPopulateUtils.IsInterfaceReference(property, fieldInfo.FieldType)) { return(true); } return(false); }
private void ForceRepopulate(object data) { SerializedProperty property = data as SerializedProperty; AutoPopulateAttribute autoPopulate = attribute as AutoPopulateAttribute; if ((property != null) && (autoPopulate != null)) { property.serializedObject.Update(); AutoPopulateUtils.PopulateValue(fieldInfo.FieldType, property, autoPopulate); property.serializedObject.ApplyModifiedProperties(); } }
private string GetTooltip(SerializedProperty property, AutoPopulateAttribute autoPopulate) { Type searchType; if (property.isArray) { searchType = AutoPopulateUtils.GetSearchType(fieldInfo.FieldType.GetElementType(), autoPopulate); } else { searchType = AutoPopulateUtils.GetSearchType(fieldInfo.FieldType, autoPopulate); } string relativeTo = ""; if (autoPopulate.FindRelativeTo != null) { string componentName = autoPopulate.FindRelativeTo.Name; string componentArticle; if (IsVowel(componentName[0])) { componentArticle = "an"; } else { componentArticle = "a"; } relativeTo = string.Format(" on the first parent with {0} {1} component", componentArticle, autoPopulate.FindRelativeTo.Name); } switch (autoPopulate.Find) { case AutoPopulateAttribute.FindBehaviour.Self: return(string.Format("Auto-populated by calling gameObject.GetComponent({0}){1}", searchType.Name, relativeTo)); case AutoPopulateAttribute.FindBehaviour.Children: return(string.Format("Auto-populated by calling gameObject.GetComponentInChildren({0}){1}", searchType.Name, relativeTo)); case AutoPopulateAttribute.FindBehaviour.Parent: return(string.Format("Auto-populated by calling gameObject.GetComponentInParent({0}){1}", searchType.Name, relativeTo)); default: throw new ArgumentOutOfRangeException(); } }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { AutoPopulateAttribute autoPopulate = attribute as AutoPopulateAttribute; if (CanAutoPopulate(property, autoPopulate)) { bool wasEnabled = GUI.enabled; GUI.enabled = GetEditable(property, autoPopulate); bool populated = false; if (AutoPopulateUtils.NeedsPopulating(property, fieldInfo.FieldType)) { populated = AutoPopulateUtils.PopulateValue(fieldInfo.FieldType, property, autoPopulate); } else { populated = true; } GUIContent tweakedLabel = new GUIContent(label.text, GetIcon(autoPopulate, populated), GetTooltip(property, autoPopulate)); if (AutoPopulateUtils.IsInterfaceReference(property, fieldInfo.FieldType)) { InterfaceReferenceDrawer.PropertyField(position, property, fieldInfo, tweakedLabel); } else { EditorGUI.PropertyField(position, property, tweakedLabel); } GUI.enabled = wasEnabled; HandlePopup(position, property, autoPopulate); } else { GUIContent tweakedLabel = new GUIContent(label.text, ErrorIcon, GetErrorTooltip()); EditorGUI.PropertyField(position, property, tweakedLabel); } }