#if UNITY_EDITOR using System; using System.IO; using UnityEngine.InputSystem.Utilities; using UnityEditor; #if UNITY_2020_2_OR_NEWER using UnityEditor.AssetImporters; #else using UnityEditor.Experimental.AssetImporters; #endif ////TODO: support for multi-editing namespace UnityEngine.InputSystem.Editor { /// /// Custom editor that allows modifying importer settings for an . /// [CustomEditor(typeof(InputActionImporter))] internal class InputActionImporterEditor : ScriptedImporterEditor { public override void OnInspectorGUI() { var inputActionAsset = GetAsset(); // ScriptedImporterEditor in 2019.2 now requires explicitly updating the SerializedObject // like in other types of editors. serializedObject.Update(); EditorGUILayout.Space(); if (inputActionAsset == null) EditorGUILayout.HelpBox("The currently selected object is not an editable input action asset.", MessageType.Info); // Button to pop up window to edit the asset. using (new EditorGUI.DisabledScope(inputActionAsset == null)) { if (GUILayout.Button(GetOpenEditorButtonText(inputActionAsset), GUILayout.Height(30))) OpenEditor(inputActionAsset); } EditorGUILayout.Space(); #if UNITY_INPUT_SYSTEM_PROJECT_WIDE_ACTIONS // Project-wide Input Actions Asset UI. InputAssetEditorUtils.DrawMakeActiveGui(InputSystem.actions, inputActionAsset, inputActionAsset ? inputActionAsset.name : "Null", "Project-wide Input Actions", (value) => InputSystem.actions = value, !EditorApplication.isPlayingOrWillChangePlaymode); EditorGUILayout.Space(); #endif // Importer settings UI. var generateWrapperCodeProperty = serializedObject.FindProperty("m_GenerateWrapperCode"); EditorGUILayout.PropertyField(generateWrapperCodeProperty, m_GenerateWrapperCodeLabel); if (generateWrapperCodeProperty.boolValue) { var wrapperCodePathProperty = serializedObject.FindProperty("m_WrapperCodePath"); var wrapperClassNameProperty = serializedObject.FindProperty("m_WrapperClassName"); var wrapperCodeNamespaceProperty = serializedObject.FindProperty("m_WrapperCodeNamespace"); EditorGUILayout.BeginHorizontal(); string defaultFileName = ""; if (inputActionAsset != null) { var assetPath = AssetDatabase.GetAssetPath(inputActionAsset); defaultFileName = Path.ChangeExtension(assetPath, ".cs"); } wrapperCodePathProperty.PropertyFieldWithDefaultText(m_WrapperCodePathLabel, defaultFileName); if (GUILayout.Button("…", EditorStyles.miniButton, GUILayout.MaxWidth(20))) { var fileName = EditorUtility.SaveFilePanel("Location for generated C# file", Path.GetDirectoryName(defaultFileName), Path.GetFileName(defaultFileName), "cs"); if (!string.IsNullOrEmpty(fileName)) { if (fileName.StartsWith(Application.dataPath)) fileName = "Assets/" + fileName.Substring(Application.dataPath.Length + 1); wrapperCodePathProperty.stringValue = fileName; } } EditorGUILayout.EndHorizontal(); string typeName = null; if (inputActionAsset != null) typeName = CSharpCodeHelpers.MakeTypeName(inputActionAsset?.name); wrapperClassNameProperty.PropertyFieldWithDefaultText(m_WrapperClassNameLabel, typeName ?? ""); if (!CSharpCodeHelpers.IsEmptyOrProperIdentifier(wrapperClassNameProperty.stringValue)) EditorGUILayout.HelpBox("Must be a valid C# identifier", MessageType.Error); wrapperCodeNamespaceProperty.PropertyFieldWithDefaultText(m_WrapperCodeNamespaceLabel, ""); if (!CSharpCodeHelpers.IsEmptyOrProperNamespaceName(wrapperCodeNamespaceProperty.stringValue)) EditorGUILayout.HelpBox("Must be a valid C# namespace name", MessageType.Error); } // Using ApplyRevertGUI requires calling Update and ApplyModifiedProperties around the serializedObject, // and will print warning messages otherwise (see warning message in ApplyRevertGUI implementation). serializedObject.ApplyModifiedProperties(); ApplyRevertGUI(); } private InputActionAsset GetAsset() { return assetTarget as InputActionAsset; } #if UNITY_INPUT_SYSTEM_PROJECT_WIDE_ACTIONS protected override bool ShouldHideOpenButton() { return IsProjectWideActionsAsset(); } private bool IsProjectWideActionsAsset() { return IsProjectWideActionsAsset(GetAsset()); } private static bool IsProjectWideActionsAsset(InputActionAsset asset) { return !ReferenceEquals(asset, null) && InputSystem.actions == asset; } #endif private string GetOpenEditorButtonText(InputActionAsset asset) { #if UNITY_INPUT_SYSTEM_PROJECT_WIDE_ACTIONS if (IsProjectWideActionsAsset(asset)) return "Edit in Project Settings Window"; #endif return "Edit Asset"; } private static void OpenEditor(InputActionAsset asset) { #if UNITY_INPUT_SYSTEM_PROJECT_WIDE_ACTIONS // Redirect to Project-settings Input Actions editor if this is the project-wide actions asset if (IsProjectWideActionsAsset(asset)) { SettingsService.OpenProjectSettings(InputSettingsPath.kSettingsRootPath); return; } // Redirect to UI-Toolkit window editor if not configured to use IMGUI explicitly if (!InputSystem.settings.useIMGUIEditorForAssets) InputActionsEditorWindow.OpenEditor(asset); else InputActionEditorWindow.OpenEditor(asset); #else // Redirect to IMGUI editor InputActionEditorWindow.OpenEditor(asset); #endif } private readonly GUIContent m_GenerateWrapperCodeLabel = EditorGUIUtility.TrTextContent("Generate C# Class"); private readonly GUIContent m_WrapperCodePathLabel = EditorGUIUtility.TrTextContent("C# Class File"); private readonly GUIContent m_WrapperClassNameLabel = EditorGUIUtility.TrTextContent("C# Class Name"); private readonly GUIContent m_WrapperCodeNamespaceLabel = EditorGUIUtility.TrTextContent("C# Class Namespace"); } } #endif // UNITY_EDITOR