public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { List <string> validTags = new List <string>(); List <string> layerTags = new List <string>(); layerTags.Add(FilterTag.DefaultTag); // Find all focus layers in scene InteractibleObject[] interactibleObjects = FilterTagDrawer.GetAllInteractibleObjects(); // Get all layer tags from interactible objects for (int i = 0; i < interactibleObjects.Length; ++i) { InteractibleObject interactibleObject = interactibleObjects[i]; if (interactibleObject != null && interactibleObject.FilterTag != null) { string tag = interactibleObject.FilterTag.Tag; if (!string.IsNullOrEmpty(tag) && !layerTags.Contains(tag)) { layerTags.Add(tag); } // Get all layer tags from other components on interactible objects Component[] accompanyingComponents = interactibleObject.GetComponents <Component>(); for (int j = 0; j < accompanyingComponents.Length; j++) { if (accompanyingComponents[j] == interactibleObject) { continue; } foreach (FieldInfo field in accompanyingComponents[j].GetType().GetFields()) { if (field.IsPublic && field.FieldType == typeof(FilterTag)) { FilterTag fieldFilterTag = (FilterTag)field.GetValue(accompanyingComponents[j]); if (fieldFilterTag != null && !string.IsNullOrEmpty(fieldFilterTag.Tag)) { layerTags.Add(fieldFilterTag.Tag); } } } } } } // Sort alphabetically layerTags.Sort(); EditorGUI.BeginProperty(position, label, property); int indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; // Label position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); // Get the valid tags property SerializedProperty currentValidTagsProperty = property.FindPropertyRelative("ValidTags"); // Add the current tags to the list for (int i = 0; i < currentValidTagsProperty.arraySize; ++i) { validTags.Add(currentValidTagsProperty.GetArrayElementAtIndex(i).stringValue); } // Get the current selected mask from the tags int mask = 0; for (int i = 0; i < layerTags.Count; ++i) { if (validTags.Contains(layerTags[i])) { mask |= 1 << i; } } // Draw the mask feild Rect rect = new Rect(position.x, position.y, 150, 18); mask = EditorGUI.MaskField(rect, mask, layerTags.ToArray()); // Get the new valid tags - the mask has changed validTags.Clear(); for (int i = 0; i < layerTags.Count; ++i) { if ((mask & 1 << i) != 0) { validTags.Add(layerTags[i]); } } // Set the tags currentValidTagsProperty.ClearArray(); currentValidTagsProperty.arraySize = validTags.Count; for (int i = 0; i < currentValidTagsProperty.arraySize; ++i) { currentValidTagsProperty.GetArrayElementAtIndex(i).stringValue = validTags[i]; } EditorGUI.indentLevel = indent; EditorGUI.EndProperty(); }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { List <string> layerTags = new List <string>(); layerTags.Add(FilterTag.DefaultTag); // Find all focus layers in scene InteractibleObject[] interactibleObjects = GetAllInteractibleObjects(); // Get all layer tags for (int i = 0; i < interactibleObjects.Length; ++i) { InteractibleObject interactibleObject = interactibleObjects[i]; if (interactibleObject != null && interactibleObject.FilterTag != null) { string tag = interactibleObject.FilterTag.Tag; if (!string.IsNullOrEmpty(tag) && !layerTags.Contains(tag)) { layerTags.Add(tag); } // Get all layer tags from other components on interactible objects Component[] accompanyingComponents = interactibleObject.GetComponents <Component>(); for (int j = 0; j < accompanyingComponents.Length; j++) { if (accompanyingComponents[j] == interactibleObject) { continue; } foreach (FieldInfo field in accompanyingComponents[j].GetType().GetFields()) { if (field.IsPublic && field.FieldType == typeof(FilterTag)) { FilterTag fieldFilterTag = (FilterTag)field.GetValue(accompanyingComponents[j]); if (fieldFilterTag != null && !string.IsNullOrEmpty(fieldFilterTag.Tag)) { layerTags.Add(fieldFilterTag.Tag); } } } } } } // Sort alphabetically layerTags.Sort(); EditorGUI.BeginProperty(position, label, property); int indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; // Label position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); // Current layer tag SerializedProperty currentLayerProperty = property.FindPropertyRelative("Tag"); int tagIndex = layerTags.IndexOf(currentLayerProperty.stringValue); // Draw popup with all current tags in scene Rect rect = new Rect(position.x, position.y, 150, 18); tagIndex = EditorGUI.Popup(rect, tagIndex, layerTags.ToArray()); // Set tag value if (tagIndex >= 0 && tagIndex < layerTags.Count) { currentLayerProperty.stringValue = layerTags.ElementAt(tagIndex); } else { currentLayerProperty.stringValue = FilterTag.DefaultTag; } // Draw tag rect = new Rect(position.x, position.y + 20, 150, 17); currentLayerProperty.stringValue = EditorGUI.TextField(rect, currentLayerProperty.stringValue); EditorGUI.indentLevel = indent; EditorGUI.EndProperty(); }