// Helpers private SerializedProperty GetFieldProperty(int index, StateFieldInfo field) { SerializedProperty serializedField = fields.GetArrayElementAtIndex(index); switch (field.fieldType) { case FieldType.INT: return(serializedField.FindPropertyRelative("intValue")); case FieldType.FLOAT: return(serializedField.FindPropertyRelative("floatValue")); case FieldType.STRING: return(serializedField.FindPropertyRelative("stringValue")); case FieldType.BOOLEAN: return(serializedField.FindPropertyRelative("boolValue")); case FieldType.VECTOR2: return(serializedField.FindPropertyRelative("vector2Value")); case FieldType.VECTOR3: return(serializedField.FindPropertyRelative("vector3Value")); case FieldType.LAYERMASK: return(serializedField.FindPropertyRelative("layerMaskValue")); case FieldType.UNITY: return(serializedField.FindPropertyRelative("unityObjectValue")); case FieldType.OBJECT: return(serializedField.FindPropertyRelative("objectValue")); } return(null); }
private void DrawField(StateFieldInfo info) { foreach (object attribute in info.info.GetCustomAttributes(true)) { if (attribute is HeaderAttribute header) { EditorGUILayout.LabelField(header.header, EditorStyles.boldLabel); } } switch (info.fieldType) { case FieldType.INT: info.intValue = EditorGUILayout.DelayedIntField(info.name, info.intValue); break; case FieldType.FLOAT: info.floatValue = EditorGUILayout.DelayedFloatField(info.name, info.floatValue); break; case FieldType.STRING: info.stringValue = EditorGUILayout.DelayedTextField(info.name, info.stringValue); break; case FieldType.BOOLEAN: info.boolValue = EditorGUILayout.Toggle(info.name, info.boolValue); break; case FieldType.VECTOR3: info.vector3Value = EditorGUILayout.Vector3Field(info.name, info.vector3Value); break; case FieldType.VECTOR2: info.vector2Value = EditorGUILayout.Vector2Field(info.name, info.vector2Value); break; case FieldType.UNITY: info.unityObjectValue = EditorGUILayout.ObjectField(info.name, info.unityObjectValue, typeof(Object), false); break; case FieldType.LAYERMASK: LayerMask tempMask = EditorGUILayout.MaskField( info.name, InternalEditorUtility.LayerMaskToConcatenatedLayersMask(info.layerMaskValue), InternalEditorUtility.layers); info.layerMaskValue = InternalEditorUtility.ConcatenatedLayersMaskToLayerMask(tempMask); break; case FieldType.OBJECT: break; case FieldType.INVALID: string invalidFormat = string.Format("Invalid field type of {0} with the name {1}", info.type, info.name); EditorGUILayout.HelpBox(invalidFormat, MessageType.Warning, true); break; default: break; } }
// State GUI private void DrawState(StateInfo state) { if (state == null) { return; } stateAsset = EditorUtil.GetAssetFromName(state.name); if (stateAsset == null) { stateAsset = EditorUtil.GetAssetFromName("State"); } EditorGUILayout.Space(); GUIStyle skin = new GUIStyle(GUI.skin.window) { padding = new RectOffset(2, 0, 0, 0), margin = new RectOffset(0, 0, 0, 0), }; //Draw all catergories in order for hiearchial type display if (stateAsset != null) { EditorGUILayout.InspectorTitlebar(true, stateAsset, false); } List <string> names = new List <string> (); //Toggle for convenience EditorGUI.indentLevel++; { for (int i = 0; i < state.fields.Count; i++) { StateFieldInfo field = state.fields[i]; string name = field.info.DeclaringType.Name; // Draw based on what the declaring type is if (!names.Contains(name)) { bool isScriptName = i == 0; if (!isScriptName) { EditorGUILayout.Space(); } if (isScriptName) { EditorGUILayout.BeginHorizontal(); { EditorGUILayout.LabelField(name, EditorStyles.boldLabel); EditorGUILayout.ObjectField(stateAsset, typeof(MonoScript), false); } EditorGUILayout.EndHorizontal(); } else { EditorGUILayout.LabelField(name, EditorStyles.boldLabel); } names.Add(name); } DrawField(state.fields[i]); } EditorGUILayout.Space(); } EditorGUI.indentLevel--; EditorUtility.SetDirty(Target); }