using OctoCore.Inputs; using UnityEditor; using UnityEngine; namespace OctoCore { [CustomEditor(typeof(OctoSettings))] public class OctoSettingsEditor : UnityEditor.Editor { SerializedProperty saveProp; SerializedProperty saveBooleansProp; SerializedProperty saveFloatsProp; SerializedProperty saveIntegersProp; SerializedProperty saveStringsProp; SerializedProperty saveVectorsProp; SerializedProperty mappingProp; SerializedProperty mappingInputActionAssetProp; SerializedProperty mappingActionsProp; SerializedProperty languagesProp; SerializedProperty languagesDefaultProp; SerializedProperty languagesSaveWrittenProp; SerializedProperty languagesSaveAudioProp; SerializedProperty languagesOverridesProp; SerializedProperty scenesProp; SerializedProperty scenesSceneDatasProp; SerializedProperty scenesUseAddressablesProp; SerializedProperty scenesFadeSettingsProp; SerializedProperty UiProp; SerializedProperty UiReferenceSizeProp; SerializedProperty UiIconsBackgroundProp; SerializedProperty applicationProp; bool foldoutApplication; bool foldoutSave; bool foldoutMapping; bool foldoutLanguages; bool foldoutScenes; bool foldoutUi; void OnEnable() { saveProp = serializedObject.FindProperty("Save"); saveBooleansProp = saveProp.FindPropertyRelative("Booleans"); saveIntegersProp = saveProp.FindPropertyRelative("Integers"); saveFloatsProp = saveProp.FindPropertyRelative("Floats"); saveStringsProp = saveProp.FindPropertyRelative("Strings"); saveVectorsProp = saveProp.FindPropertyRelative("Vectors"); mappingProp = serializedObject.FindProperty("Mapping"); mappingInputActionAssetProp = mappingProp.FindPropertyRelative("InputActionAsset"); mappingActionsProp = mappingProp.FindPropertyRelative("Actions"); languagesProp = serializedObject.FindProperty("Languages"); languagesDefaultProp = languagesProp.FindPropertyRelative("Default"); languagesSaveWrittenProp = languagesProp.FindPropertyRelative("SaveWritten"); languagesSaveAudioProp = languagesProp.FindPropertyRelative("SaveAudio"); languagesOverridesProp = languagesProp.FindPropertyRelative("Overrides"); scenesProp = serializedObject.FindProperty("Scenes"); scenesSceneDatasProp = scenesProp.FindPropertyRelative("SceneDatas"); scenesUseAddressablesProp = scenesProp.FindPropertyRelative("UseAddressables"); scenesFadeSettingsProp = scenesProp.FindPropertyRelative("FadeSettings"); UiProp = serializedObject.FindProperty("Ui"); UiReferenceSizeProp = UiProp.FindPropertyRelative("ReferenceSize"); UiIconsBackgroundProp = UiProp.FindPropertyRelative("IconsBackground"); applicationProp = serializedObject.FindProperty("Application"); } public override void OnInspectorGUI() { OctoSettings data = (OctoSettings)target; serializedObject.Update(); GUIStyle foldout = new GUIStyle(EditorStyles.foldout) { fontStyle = FontStyle.Bold }; // ═══════════════════════════════════════════════════════════════════ // SAVE // ═══════════════════════════════════════════════════════════════════ EditorGUILayout.BeginVertical("box"); EditorGUI.indentLevel++; foldoutSave = EditorGUILayout.Foldout(foldoutSave, "SAVE", true, foldout); if (foldoutSave) { EditorGUILayout.Space(); EditorGUI.indentLevel++; if (GUILayout.Button("Get All Datas")) { data.GetAllDatas(); } EditorGUILayout.Space(); EditorGUILayout.PropertyField(saveBooleansProp); EditorGUILayout.PropertyField(saveFloatsProp); EditorGUILayout.PropertyField(saveIntegersProp); EditorGUILayout.PropertyField(saveStringsProp); EditorGUILayout.PropertyField(saveVectorsProp); EditorGUI.indentLevel--; EditorGUILayout.Space(4); } EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.Space(); // ═══════════════════════════════════════════════════════════════════ // MAPPING // ═══════════════════════════════════════════════════════════════════ EditorGUILayout.BeginVertical("box"); EditorGUI.indentLevel++; foldoutMapping = EditorGUILayout.Foldout(foldoutMapping, "MAPPING", true, foldout); if (foldoutMapping) { EditorGUILayout.Space(); #if ENABLE_INPUT_SYSTEM EditorGUILayout.PropertyField(mappingInputActionAssetProp); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(mappingActionsProp); EditorGUI.indentLevel--; EditorGUILayout.Space(); EditorGUILayout.HelpBox( "To generate OctoActions enum:\n" + "1. Assign an Input Action Asset first\n" + "2. Click 'Generate Inputs'\n\n" + "Note: The enum will be generated in Assets/OctoCore/ (safe from package updates)", MessageType.Info ); EditorGUILayout.Space(5); GUI.enabled = data.Mapping.InputActionAsset != null; if (GUILayout.Button("Generate Inputs", GUILayout.Height(20))) { data.GenerateInputs(); } GUI.enabled = true; #else EditorGUILayout.HelpBox( "Input System Package is not enabled.\n" + "Please enable it in Project Settings > Player > Active Input Handling.", MessageType.Warning ); #endif EditorGUILayout.Space(4); } EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.Space(); // ═══════════════════════════════════════════════════════════════════ // LANGUAGES // ═══════════════════════════════════════════════════════════════════ EditorGUILayout.BeginVertical("box"); EditorGUI.indentLevel++; foldoutLanguages = EditorGUILayout.Foldout(foldoutLanguages, "LANGUAGES", true, foldout); if (foldoutLanguages) { EditorGUILayout.Space(); EditorGUILayout.PropertyField(languagesDefaultProp); EditorGUILayout.PropertyField(languagesSaveWrittenProp); EditorGUILayout.PropertyField(languagesSaveAudioProp); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(languagesOverridesProp); EditorGUI.indentLevel--; EditorGUILayout.Space(4); } EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.Space(); // ═══════════════════════════════════════════════════════════════════ // SCENES // ═══════════════════════════════════════════════════════════════════ EditorGUILayout.BeginVertical("box"); EditorGUI.indentLevel++; foldoutScenes = EditorGUILayout.Foldout(foldoutScenes, "SCENES", true, foldout); if (foldoutScenes) { EditorGUILayout.Space(); EditorGUI.indentLevel++; if (GUILayout.Button("Get All Scene Datas")) { data.GetAllSceneDatas(); } EditorGUILayout.Space(); EditorGUILayout.PropertyField(scenesSceneDatasProp); EditorGUILayout.PropertyField(scenesUseAddressablesProp); EditorGUILayout.Space(); EditorGUILayout.LabelField("Fade Settings", EditorStyles.boldLabel); EditorGUI.indentLevel++; EditorGUILayout.PropertyField(scenesFadeSettingsProp); EditorGUI.indentLevel--; EditorGUI.indentLevel--; EditorGUILayout.Space(4); } EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.Space(); // ═══════════════════════════════════════════════════════════════════ // UI // ═══════════════════════════════════════════════════════════════════ EditorGUILayout.BeginVertical("box"); EditorGUI.indentLevel++; foldoutUi = EditorGUILayout.Foldout(foldoutUi, "INTERFACE", true, foldout); if (foldoutUi) { EditorGUILayout.Space(); EditorGUILayout.PropertyField(UiReferenceSizeProp); EditorGUILayout.PropertyField(UiIconsBackgroundProp); EditorGUILayout.Space(4); } EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.Space(); // ═══════════════════════════════════════════════════════════════════ // APPLICATION // ═══════════════════════════════════════════════════════════════════ EditorGUILayout.BeginVertical("box"); EditorGUI.indentLevel++; foldoutApplication = EditorGUILayout.Foldout(foldoutApplication, "APPLICATION", true, foldout); if (foldoutApplication) { EditorGUILayout.Space(); EditorGUILayout.PropertyField(applicationProp.FindPropertyRelative("TargetFrameRate")); EditorGUILayout.PropertyField(applicationProp.FindPropertyRelative("VSyncCount")); EditorGUILayout.Space(4); } EditorGUI.indentLevel--; EditorGUILayout.EndVertical(); EditorGUILayout.Space(); serializedObject.ApplyModifiedProperties(); } } }