using UnityEngine.SceneManagement; using UnityEngine; using UnityEditor; using GameplayIngredients.StateMachines; namespace GameplayIngredients.Editor { [CustomPropertyDrawer(typeof(StateMachineStateAttribute))] public class StateMachineStatePropertyDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { string propertyName = (attribute as StateMachineStateAttribute).PropertyName; StateMachine stateMachine; if (propertyName == "") stateMachine = (StateMachine)property.serializedObject.targetObject; else stateMachine = (StateMachine)property.serializedObject.FindProperty(propertyName).objectReferenceValue; if (stateMachine == null) { EditorGUI.HelpBox(position, "StateMachineStateAttribute property parameter references a null or not a GameplayIngredients.StateMachines.StateMachine type", MessageType.Error); } else { string currentValue = property.stringValue; int count = stateMachine.States.Length; int[] indices = new int[count]; GUIContent[] labels = new GUIContent[count]; int selected = -1; for(int i = 0; i< count; i++) { string stateName = stateMachine.States[i].StateName; if (stateName == currentValue) selected = i; indices[i] = i; labels[i] = new GUIContent(stateName); } int newIdx = EditorGUI.IntPopup(position, new GUIContent(property.displayName), selected, labels, indices); if(GUI.changed) { property.stringValue = stateMachine.States[newIdx].StateName; } } } static class Styles { public static GUIStyle errorfield; static Styles() { errorfield = new GUIStyle(EditorStyles.objectField); } } } }