using OctoberStudio.UI; using System; using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; namespace OctoberStudio.Input { public class InputManager : MonoBehaviour, IInputManager { private static InputManager instance; [Header("References")] [SerializeField] HighlightsParentBehavior highlightsParent; public HighlightsParentBehavior Highlights => highlightsParent; private InputAsset inputAsset; public InputAsset InputAsset => inputAsset; private InputSave save; public InputType ActiveInput { get => save.ActiveInput; private set => save.ActiveInput = value; } public Vector2 MovementValue { get; private set; } public JoystickBehavior Joystick { get; private set; } public event UnityAction onInputChanged; private void Awake() { if(instance != null) { Destroy(gameObject); return; } instance = this; DontDestroyOnLoad(gameObject); GameController.RegisterInputManager(this); inputAsset = new InputAsset(); Init(); } private void OnEnable() { inputAsset.Enable(); } private void OnDisable() { if(inputAsset != null) inputAsset.Disable(); } public void Init() { save = GameController.SaveManager.GetSave("Input"); if(Gamepad.current != null) { ActiveInput = InputType.Gamepad; } else { ActiveInput = InputType.UIJoystick; } inputAsset.GamepadDetection.Detection.performed += GamepadDetection; } private void Update() { if (ActiveInput != InputType.Keyboard && Keyboard.current != null && Keyboard.current.wasUpdatedThisFrame && !Keyboard.current.CheckStateIsAtDefaultIgnoringNoise()) { Debug.Log("Switching To Keyboard"); var prevInput = ActiveInput; ActiveInput = InputType.Keyboard; if (Joystick != null) Joystick.Disable(); highlightsParent.EnableArrows(); onInputChanged?.Invoke(prevInput, InputType.Keyboard); } if(ActiveInput != InputType.UIJoystick && (Mouse.current != null && Mouse.current.leftButton.wasPressedThisFrame || ActiveInput == InputType.Gamepad && Gamepad.current == null || Touchscreen.current != null && Touchscreen.current.wasUpdatedThisFrame)) { Debug.Log("Switching To UI Joystick"); var prevInput = ActiveInput; ActiveInput = InputType.UIJoystick; if (Joystick != null) Joystick.Enable(); highlightsParent.DisableArrows(); onInputChanged?.Invoke(prevInput, InputType.UIJoystick); } if (ActiveInput == InputType.UIJoystick && Joystick != null) { MovementValue = Joystick.Value; } else { MovementValue = inputAsset.Gameplay.Movement.ReadValue(); } } private void GamepadDetection(InputAction.CallbackContext obj) { if (ActiveInput != InputType.Gamepad) { Debug.Log("Switching To Gamepad"); var prevInput = ActiveInput; ActiveInput = InputType.Gamepad; if (Joystick != null) Joystick.Disable(); highlightsParent.EnableArrows(); onInputChanged?.Invoke(prevInput, InputType.Gamepad); } } public void RegisterJoystick(JoystickBehavior joystick) { Joystick = joystick; if (ActiveInput == InputType.UIJoystick) { joystick.Enable(); } else { joystick.Disable(); } } public void RemoveJoystick() { Joystick = null; } } public enum InputType { UIJoystick = 1, Keyboard = 2, Gamepad = 4, } }