#if PACKAGE_INPUT_SYSTEM_EXISTS using System.Linq; using JetBrains.Annotations; using Unity.VisualScripting.FullSerializer; using Unity.VisualScripting.InputSystem; using UnityEditor; using UnityEngine; using UnityEngine.InputSystem; namespace Unity.VisualScripting { [Inspector(typeof(InputAction))] public class InputActionInspector : Inspector { private readonly GraphReference m_Reference; private readonly OnInputSystemEvent m_InputSystemUnit; public InputActionInspector(Metadata metadata, GraphReference reference, OnInputSystemEvent inputSystemUnit) : base(metadata) { m_Reference = reference; m_InputSystemUnit = inputSystemUnit; } // Called by reflection from TypeUtility.Instantiate [UsedImplicitly] public InputActionInspector(Metadata metadata) : base(metadata) { } protected override float GetHeight(float width, GUIContent label) => EditorGUIUtility.singleLineHeight; public override float GetAdaptiveWidth() { return Mathf.Max(100, metadata.value is InputAction action && action.name != null ? (EditorStyles.popup.CalcSize(new GUIContent(action.name)).x + 1) : 0); } protected override void OnGUI(Rect position, GUIContent label) { position = BeginLabeledBlock(metadata, position, label); var togglePosition = position.VerticalSection(ref y, EditorGUIUtility.singleLineHeight); if (m_InputSystemUnit == null) { EndBlock(metadata); return; } var inputActionAsset = Flow.Predict(m_InputSystemUnit.Target, m_Reference)?.actions; if (!inputActionAsset) EditorGUI.LabelField(togglePosition, "No Actions found"); else { var value = metadata.value is InputAction ? (InputAction)metadata.value : default; int currentIndex = -1; if (value != null && value.id != default) { int i = 0; foreach (var playerInputAction in inputActionAsset) { if (playerInputAction.id == value.id) { currentIndex = i; break; } i++; } } var displayedOptions = Enumerable.Repeat(new GUIContent(""), 1).Concat(inputActionAsset.Select(a => new GUIContent(a.name))).ToArray(); var newIndex = EditorGUI.Popup(togglePosition, currentIndex + 1, displayedOptions); if (EndBlock(metadata) || ActionTypeHasChanged(currentIndex, value)) { metadata.RecordUndo(); if (newIndex == 0) metadata.value = default; else { var inputAction = inputActionAsset.ElementAt(newIndex - 1); metadata.value = InputAction_DirectConverter.MakeInputActionWithId(inputAction.id.ToString(), inputAction.name, inputAction.expectedControlType, inputAction.type); m_InputSystemUnit.Analyser(m_Reference).isDirty = true; } } return; } EndBlock(metadata); bool ActionTypeHasChanged(int currentIndex, InputAction value) { try { // getting the total action count would be expensive, as it would need to be computed everytime return value?.type != inputActionAsset.ElementAt(currentIndex)?.type; } catch { return true; } } } } } #endif