private void DrawDictionary(string title, ref string[] keys, Action <int> setArrayLengths, Action <int> drawArrayValueForIndex) { GUILayout.BeginHorizontal(); GUILayout.Label(title); int newLength = keys.Length; if (GUILayout.Button("Add", GUILayout.Width(80))) { newLength++; } if (keys.Length > 0 && GUILayout.Button("Remove", GUILayout.Width(80))) { newLength--; } GUILayout.EndHorizontal(); if (newLength != keys.Length) { EditorGUIUtils.SetArrayLength(ref keys, newLength); setArrayLengths(newLength); } for (int i = 0; i < keys.Length; i++) { GUILayout.BeginVertical(GUI.skin.box); EditorGUI.indentLevel++; { if (keys[i] == null) { keys[i] = string.Empty; } string key = keys[i]; if (!showState.ContainsKey(key)) { showState[key] = true; } showState[key] = EditorGUILayout.Foldout(showState[key], key); if (showState[key]) { drawArrayValueForIndex(i); } } EditorGUI.indentLevel--; GUILayout.EndVertical(); } }
public override void OnInspectorGUI() { EditorGUILayout.PropertyField(serializedObject.FindProperty("OverrideInitEnabled")); if (worldObject.OverrideInitEnabled) { this.DrawPropertySection("Initial Enabled Overrides", ref showInitiallyEnabled, "OnInitialState", "OnInitiallyEnabled", "OnInitiallyDisabled"); } this.DrawPropertySection("Enabled", ref showEnabled, "OnEnabledChanged", "OnEnabled", "OnDisabled"); EditorGUILayout.PropertyField(serializedObject.FindProperty("OverrideInitOperating")); if (worldObject.OverrideInitOperating) { this.DrawPropertySection("Initial Operating Overrides", ref showInitiallyEnabled, "OnInitialOperatingState", "OnInitiallyEnabledOperating", "OnInitiallyDisabledOperating"); } this.DrawPropertySection("Operating", ref showOperating, "OnOperatingChanged", "OnEnableOperating", "OnDisableOperating"); this.DrawPropertySection("Using", ref showUsing, "OnUsingChanged", "OnEnableUsing", "OnDisableUsing"); #region State Toggle Events this.DrawDictionary( "Boolean State Events", ref worldObject.States, (int newLength) => { EditorGUIUtils.SetArrayLength(ref worldObject.States, newLength); EditorGUIUtils.SetArrayLength(ref worldObject.OnStateChangedEvents, newLength); EditorGUIUtils.SetArrayLength(ref worldObject.OnStateEnabledEvents, newLength); EditorGUIUtils.SetArrayLength(ref worldObject.OnStateDisabledEvents, newLength); }, (int i) => { DrawArrayElement("Event Name", "States", i); DrawArrayElement("Changed", "OnStateChangedEvents", i); DrawArrayElement("Enabled", "OnStateEnabledEvents", i); DrawArrayElement("Disabled", "OnStateDisabledEvents", i); }); #endregion #region String State Events this.DrawDictionary( "String State Events", ref worldObject.StringStates, (int newLength) => { EditorGUIUtils.SetArrayLength(ref worldObject.StringStates, newLength); EditorGUIUtils.SetArrayLength(ref worldObject.OnStringStateChanged, newLength); }, (int i) => { DrawArrayElement("Event Name", "StringStates", i); DrawArrayElement("Handler", "OnStringStateChanged", i); }); #endregion #region Float State Events this.DrawDictionary( "Float State Events", ref worldObject.FloatStates, (int newLength) => { EditorGUIUtils.SetArrayLength(ref worldObject.FloatStates, newLength); EditorGUIUtils.SetArrayLength(ref worldObject.OnFloatStateChanged, newLength); }, (int i) => { DrawArrayElement("Event Name", "FloatStates", i); DrawArrayElement("Handler", "OnFloatStateChanged", i); }); #endregion #region One Off Events this.DrawDictionary( "Stateless Events", ref worldObject.Events, (int newLength) => { EditorGUIUtils.SetArrayLength(ref worldObject.Events, newLength); EditorGUIUtils.SetArrayLength(ref worldObject.EventHandlers, newLength); }, (int i) => { DrawArrayElement("Event Name", "Events", i); DrawArrayElement("Handler", "EventHandlers", i); }); #endregion worldObject.interactable = EditorGUILayout.Toggle("Interactable", worldObject.interactable); if (worldObject.hasOccupancy = EditorGUILayout.Toggle("Has Occupancy", worldObject.hasOccupancy)) { worldObject.occupancyOffset = EditorGUILayout.Vector3Field("Occupancy Offset", worldObject.occupancyOffset); if (worldObject.overrideOccupancy = EditorGUILayout.Toggle("Override Occupancy", worldObject.overrideOccupancy)) { worldObject.size = EditorGUILayout.Vector3Field("Override Size", worldObject.size); } } #if ECO_DEV ShowInternalDebugTools(); #else Shader.EnableKeyword("NO_CURVE"); // mod kit doesn't have curve helper #endif serializedObject.ApplyModifiedProperties(); }