using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.UI; using UnityEngine.UI; public class InputManager : MonoBehaviour { private PlayerControlsAlt playerControls; private PlayerInput pInput; private GameManager gameMgr; private ApplyForceToPlayer applyForce; private ApplyForceController applyForceController; private SoundManager soundMgr; private LevelCameraEffects levelEffects; SettingsManager settingsMgr; private InputSystemUIInputModule uiInput; private StandaloneInputModule standaloneInput; private bool gamepadActive = false; private bool typingUsername = false; public Image kbImage; public Image gamepadImage; public Color fadedInputColor, litInputColor; public bool demoMode; private Vector2 joystickPosition; private void Awake() { playerControls = new PlayerControlsAlt(); gameMgr = GetComponent<GameManager>(); soundMgr = GetComponent<SoundManager>(); settingsMgr = GetComponent<SettingsManager>(); pInput = GetComponent<PlayerInput>(); } private void Start() { applyForce = ObjectManager.GetObject(3).GetComponent<ApplyForceToPlayer>(); applyForceController = ObjectManager.GetObject(3).GetComponent<ApplyForceController>(); levelEffects = GUIManager.GetObject(12).GetComponent<LevelCameraEffects>(); uiInput = ObjectManager.GetObject(5).GetComponent<InputSystemUIInputModule>(); standaloneInput = ObjectManager.GetObject(5).GetComponent<StandaloneInputModule>(); GUIManager.SetDemoModeState(demoMode); //keyboard menu navigation playerControls.PlayerKeyboard.OpenPauseMenu.performed += _ => OnPauseKeyPress(); playerControls.PlayerKeyboard.OpenUnlocksMenu.performed += _ => GUIManager.ManuallyInvokeUnlocksButton(); //gamepad menu navigation playerControls.PlayerGamepad.OpenPauseMenu.performed += _ => OnPauseKeyPress(); playerControls.PlayerGamepad.CloseMenu.performed += _ => GUIManager.CloseAllSubMenus(); playerControls.PlayerGamepad.CloseMenu.performed += _ => gameMgr.CloseEscapeMenu(); playerControls.PlayerGamepad.OpenUnlocksMenu.performed += _ => GUIManager.ManuallyInvokeUnlocksButton(); //keyboard drag playerControls.PlayerKeyboard.DragStarted.performed += _ => applyForce.OnMouseButtonDown(); playerControls.PlayerKeyboard.DragEnded.performed += _ => applyForce.OnMouseButtonUp(); playerControls.PlayerKeyboard.DragCanceled.performed += _ => applyForce.OnDragCanceled(); //gamepad drag & launch playerControls.PlayerGamepad.DragStartedJoy.performed += _ => applyForceController.OnJoystickBeginMove(); playerControls.PlayerGamepad.LaunchPlayer.performed += _ => applyForceController.OnTriggerPull(); playerControls.PlayerGamepad.DragEndedJoy.performed += _ => applyForceController.HideDragLine(); playerControls.PlayerGamepad.JoystickMovement.performed += cntxt => joystickPosition = cntxt.ReadValue<Vector2>(); playerControls.PlayerGamepad.LaunchPlayer.performed += _ => joystickPosition = new UnityEngine.Vector2(0, 0); playerControls.PlayerGamepad.DragEndedJoy.performed += _ => joystickPosition = new UnityEngine.Vector2(0, 0); //keyboard music control playerControls.PlayerKeyboard.MusicPauseUnpause.performed += _ => soundMgr.PauseMusic(); playerControls.PlayerKeyboard.MusicPlayNextTrack.performed += _ => soundMgr.PlayNextMusicTrack(); playerControls.PlayerKeyboard.MusicPlayLastTrack.performed += _ => soundMgr.PlayLastMusicTrack(); playerControls.PlayerKeyboard.ToggleMusicShuffle.performed += _ => GUIManager.ManuallyInvokeShuffleButton(); playerControls.PlayerKeyboard.ToggleMusicLoop.performed += _ => GUIManager.ManuallyInvokeLoopButton(); //gamepad music control playerControls.PlayerGamepad.MusicPauseUnpause.performed += _ => soundMgr.PauseMusic(); playerControls.PlayerGamepad.MusicPlayNextTrack.performed += _ => soundMgr.PlayNextMusicTrack(); playerControls.PlayerGamepad.MusicPlayLastTrack.performed += _ => soundMgr.PlayLastMusicTrack(); playerControls.PlayerGamepad.ToggleMusicShuffle.performed += _ => GUIManager.ManuallyInvokeShuffleButton(); playerControls.PlayerGamepad.ToggleMusicLoop.performed += _ => GUIManager.ManuallyInvokeLoopButton(); //keyboard gameplay playerControls.PlayerKeyboard.ZoomOut.performed += _ => levelEffects.ActivateFullView(); //playerControls.PlayerKeyboard.ScrollWheel.performed += _ => levelEffects.SetZoomLevel(_.ReadValue<Vector2>()); //gamepad gameplay playerControls.PlayerGamepad.ZoomOut.performed += _ => levelEffects.ActivateFullView(); InputSystem.onDeviceChange += (device, change) => { switch (change) { case InputDeviceChange.Disconnected: if (!GUIManager.GetMainMenuCanvasState()) OnPauseKeyPress(); break; default: // See InputDeviceChange reference for other event types. break; } }; kbImage.color = litInputColor; gamepadImage.color = fadedInputColor; } private void Update() { if (pInput.currentControlScheme == "Gamepad" && !applyForceController.enabled) EnableGamepadControls(); if (pInput.currentControlScheme == "Mouse & KB" && !applyForce.enabled) EnableKeyboardControls(); float dragValue = playerControls.PlayerKeyboard.DragContinued.ReadValue<float>(); if (dragValue == 1) applyForce.OnMouseButtonHeldDown(); if ((joystickPosition.x > 0.05f || joystickPosition.x < -0.05f) || (joystickPosition.y > 0.05f || joystickPosition.y < -0.05f)) applyForceController.OnJoystickHeld(); } private void OnEnable() { playerControls.Enable(); } private void OnDisable() { playerControls.Disable(); } public void UpdateTutorialInputTexts() { GUIManager.SetTutorialControlsTexts(GetBindingString(0, gamepadActive), GetBindingString(1, gamepadActive), GetBindingString(2, gamepadActive), GetBindingString(3, gamepadActive), GetBindingString(4, gamepadActive), gamepadActive); } public void EnableKeyboardControls() { applyForce.enabled = true; applyForceController.enabled = false; gamepadActive = false; settingsMgr.SetAllButtonTexts(); UpdateTutorialInputTexts(); //uiInput.enabled = false; //standaloneInput.enabled = true; kbImage.color = litInputColor; gamepadImage.color = fadedInputColor; Cursor.visible = true; } public void EnableGamepadControls() { applyForce.enabled = false; applyForceController.enabled = true; gamepadActive = true; settingsMgr.SetAllButtonTexts(); UpdateTutorialInputTexts(); //uiInput.enabled = true; //standaloneInput.enabled = false; kbImage.color = fadedInputColor; gamepadImage.color = litInputColor; Cursor.visible = false; GUIManager.SetSelectedUIObjectWithMenuContext(); } public bool GetGamepadActiveState() { return gamepadActive; } public void SetTypingUsernameState(bool state) { typingUsername = state; } public void OnPauseKeyPress() { if (GUIManager.GetMainMenuCanvasState() == false) { if (GUIManager.GetPauseCanvasState() == false) gameMgr.OpenEscapeMenu(); else gameMgr.CloseEscapeMenu(); } } public Vector2 GetMousePosition() { return Mouse.current.position.ReadValue(); } public Vector2 GetJoystickPosition() { return joystickPosition; } public bool GetMouseOverUI() { EventSystem eventSys = ObjectManager.GetObject(5).GetComponent<EventSystem>(); PointerEventData eventData = new PointerEventData(eventSys) { position = GetMousePosition() }; List<RaycastResult> results = new List<RaycastResult>(); eventSys.RaycastAll(eventData, results); foreach (RaycastResult item in results) { if (item.gameObject.GetComponent<Button>()) return true; } return false; } public bool GetTouchOverUI() { Touch touch = Input.GetTouch(0); EventSystem eventSys = ObjectManager.GetObject(5).GetComponent<EventSystem>(); PointerEventData eventData = new PointerEventData(eventSys) { position = touch.position }; List<RaycastResult> results = new List<RaycastResult>(); eventSys.RaycastAll(eventData, results); foreach (RaycastResult item in results) { if (item.gameObject.GetComponent<Button>()) return true; } return false; } public void SetNewBindingForAction(int buttonID, int actionID, int bindingID) { InputAction targetAction = null; switch (actionID) { default: break; case 0: targetAction = playerControls.PlayerKeyboard.OpenPauseMenu; break; case 1: targetAction = playerControls.PlayerKeyboard.MusicPlayNextTrack; break; case 2: targetAction = playerControls.PlayerKeyboard.MusicPauseUnpause; break; case 3: targetAction = playerControls.PlayerKeyboard.MusicPlayLastTrack; break; case 4: targetAction = playerControls.PlayerKeyboard.ZoomOut; break; case 5: targetAction = playerControls.PlayerGamepad.OpenPauseMenu; break; case 6: targetAction = playerControls.PlayerGamepad.MusicPlayNextTrack; break; case 7: targetAction = playerControls.PlayerGamepad.MusicPauseUnpause; break; case 8: targetAction = playerControls.PlayerGamepad.MusicPlayLastTrack; break; case 9: targetAction = playerControls.PlayerGamepad.ZoomOut; break; case 10: targetAction = playerControls.PlayerGamepad.LaunchPlayer; break; case 11: targetAction = playerControls.PlayerKeyboard.OpenUnlocksMenu; break; case 12: targetAction = playerControls.PlayerKeyboard.ToggleMusicShuffle; break; case 13: targetAction = playerControls.PlayerKeyboard.ToggleMusicLoop; break; case 14: targetAction = playerControls.PlayerGamepad.OpenUnlocksMenu; break; case 15: targetAction = playerControls.PlayerGamepad.ToggleMusicShuffle; break; case 16: targetAction = playerControls.PlayerGamepad.ToggleMusicLoop; break; } targetAction.Disable(); var rebindOp = targetAction.PerformInteractiveRebinding(bindingID); rebindOp.OnComplete( operation => { PlayerPrefs.SetString("pauseKeyKB", GetBindingPath(0, 0)); PlayerPrefs.SetString("zoomKeyKB", GetBindingPath(1, 0)); PlayerPrefs.SetString("playNextKeyKB", GetBindingPath(2, 0)); PlayerPrefs.SetString("pauseMusicKeyKB", GetBindingPath(3, 0)); PlayerPrefs.SetString("playLastKeyKB", GetBindingPath(4, 0)); PlayerPrefs.SetString("openUnlocksKB", GetBindingPath(5, 0)); PlayerPrefs.SetString("toggleShuffleKB", GetBindingPath(6, 0)); PlayerPrefs.SetString("toggleLoopKB", GetBindingPath(7, 0)); PlayerPrefs.SetString("pauseKeyGP", GetBindingPath(0, 1)); PlayerPrefs.SetString("zoomKeyGP", GetBindingPath(1, 1)); PlayerPrefs.SetString("playNextKeyGP", GetBindingPath(2, 1)); PlayerPrefs.SetString("pauseMusicKeyGP", GetBindingPath(3, 1)); PlayerPrefs.SetString("playLastKeyGP", GetBindingPath(4, 1)); PlayerPrefs.SetString("openUnlocksGP", GetBindingPath(5, 1)); PlayerPrefs.SetString("toggleShuffleGP", GetBindingPath(6, 1)); PlayerPrefs.SetString("toggleLoopGP", GetBindingPath(7, 1)); PlayerPrefs.SetString("launchPlayer", GetBindingPath(8, 1)); targetAction.Enable(); operation.Dispose(); settingsMgr.SetButtonText(buttonID); GUIManager.SetTutorialControlsTexts(GetBindingString(0, gamepadActive), GetBindingString(1, gamepadActive), GetBindingString(2, gamepadActive), GetBindingString(3, gamepadActive), GetBindingString(4, gamepadActive), gamepadActive); } ); rebindOp.Start(); } public string GetBindingString(int bindingID, bool controlType) { string bindingName = "null"; if (controlType == false) bindingName = playerControls.PlayerKeyboard.OpenPauseMenu.actionMap.actions[bindingID].GetBindingDisplayString(); else if (controlType == true) bindingName = playerControls.PlayerGamepad.OpenPauseMenu.actionMap.actions[bindingID].GetBindingDisplayString(); return bindingName; } public string GetBindingPath(int bindingID, int controlType) { string bindingPath = ""; switch (bindingID) { default: break; case 0: if (controlType == 0) bindingPath = playerControls.PlayerKeyboard.OpenPauseMenu.GetBindingDisplayString(); else bindingPath = playerControls.PlayerGamepad.OpenPauseMenu.GetBindingDisplayString(); break; case 1: if (controlType == 0) bindingPath = playerControls.PlayerKeyboard.ZoomOut.GetBindingDisplayString(); else bindingPath = playerControls.PlayerGamepad.ZoomOut.GetBindingDisplayString(); break; case 2: if (controlType == 0) bindingPath = playerControls.PlayerKeyboard.MusicPlayNextTrack.GetBindingDisplayString(); else bindingPath = playerControls.PlayerGamepad.MusicPlayNextTrack.GetBindingDisplayString(); break; case 3: if (controlType == 0) bindingPath = playerControls.PlayerKeyboard.MusicPauseUnpause.GetBindingDisplayString(); else bindingPath = playerControls.PlayerGamepad.MusicPauseUnpause.GetBindingDisplayString(); break; case 4: if (controlType == 0) bindingPath = playerControls.PlayerKeyboard.MusicPlayLastTrack.GetBindingDisplayString(); else bindingPath = playerControls.PlayerGamepad.MusicPlayLastTrack.GetBindingDisplayString(); break; case 5: if (controlType == 0) bindingPath = playerControls.PlayerKeyboard.OpenUnlocksMenu.GetBindingDisplayString(); else bindingPath = playerControls.PlayerGamepad.OpenUnlocksMenu.GetBindingDisplayString(); break; case 6: if (controlType == 0) bindingPath = playerControls.PlayerKeyboard.ToggleMusicShuffle.GetBindingDisplayString(); else bindingPath = playerControls.PlayerGamepad.ToggleMusicShuffle.GetBindingDisplayString(); break; case 7: if (controlType == 0) bindingPath = playerControls.PlayerKeyboard.ToggleMusicLoop.GetBindingDisplayString(); else bindingPath = playerControls.PlayerGamepad.ToggleMusicLoop.GetBindingDisplayString(); break; case 8: if (controlType == 1) bindingPath = playerControls.PlayerGamepad.LaunchPlayer.GetBindingDisplayString(); break; } return bindingPath; } public void SetSavedBinding(int bindingID, string bindingPath, int bindingType) { string newPath; if (bindingType == 0) { newPath = "<Keyboard>/" + bindingPath; playerControls.PlayerKeyboard.OpenPauseMenu.Disable(); playerControls.PlayerKeyboard.OpenPauseMenu.actionMap.actions[bindingID].ApplyBindingOverride(0, newPath); playerControls.PlayerKeyboard.OpenPauseMenu.Enable(); } else { newPath = "<Gamepad>/" + bindingPath; playerControls.PlayerGamepad.OpenPauseMenu.Disable(); playerControls.PlayerGamepad.OpenPauseMenu.actionMap.actions[bindingID].ApplyBindingOverride(0, newPath); playerControls.PlayerGamepad.OpenPauseMenu.Enable(); } GUIManager.SetTutorialControlsTexts(GetBindingString(0, gamepadActive), GetBindingString(1, gamepadActive), GetBindingString(2, gamepadActive), GetBindingString(3, gamepadActive), GetBindingString(4, gamepadActive), gamepadActive); } public void SetDefaultBinding(int bindingID) { string bindingPath = ""; InputAction targetAction = null; switch (bindingID) { default: break; case 0: bindingPath = "<Keyboard>/escape"; targetAction = playerControls.PlayerKeyboard.OpenPauseMenu; break; case 7: bindingPath = "<Keyboard>/f"; targetAction = playerControls.PlayerKeyboard.ZoomOut; break; case 4: bindingPath = "<Keyboard>/c"; targetAction = playerControls.PlayerKeyboard.MusicPlayNextTrack; break; case 5: bindingPath = "<Keyboard>/space"; targetAction = playerControls.PlayerKeyboard.MusicPauseUnpause; break; case 6: bindingPath = "<Keyboard>/x"; targetAction = playerControls.PlayerKeyboard.MusicPlayLastTrack; break; case 8: bindingPath = "<Gamepad>/start"; targetAction = playerControls.PlayerGamepad.OpenPauseMenu; break; case 9: bindingPath = "<Gamepad>/dpad/up"; targetAction = playerControls.PlayerGamepad.ZoomOut; break; case 10: bindingPath = "<Gamepad>/dpad/right"; targetAction = playerControls.PlayerGamepad.MusicPlayNextTrack; break; case 11: bindingPath = "<Gamepad>/dpad/down"; targetAction = playerControls.PlayerGamepad.MusicPauseUnpause; break; case 12: bindingPath = "<Gamepad>/dpad/left"; targetAction = playerControls.PlayerGamepad.MusicPlayLastTrack; break; case 13: bindingPath = "<Gamepad>/select"; targetAction = playerControls.PlayerGamepad.OpenUnlocksMenu; break; case 14: bindingPath = "<Gamepad>/buttonWest"; targetAction = playerControls.PlayerGamepad.ToggleMusicShuffle; break; case 15: bindingPath = "<Gamepad>/buttonNorth"; targetAction = playerControls.PlayerGamepad.ToggleMusicLoop; break; case 16: bindingPath = "<Gamepad>/rightTrigger"; targetAction = playerControls.PlayerGamepad.LaunchPlayer; break; case 17: bindingPath = "<Keyboard>/tab"; targetAction = playerControls.PlayerKeyboard.OpenUnlocksMenu; break; case 18: bindingPath = "<Keyboard>/v"; targetAction = playerControls.PlayerKeyboard.ToggleMusicShuffle; break; case 19: bindingPath = "<Keyboard>/b"; targetAction = playerControls.PlayerKeyboard.ToggleMusicLoop; break; } //using the index saved from previous changes, find the key that matches the index and then override the current action key targetAction.Disable(); targetAction.ApplyBindingOverride(0, bindingPath); targetAction.Enable(); GUIManager.SetTutorialControlsTexts(GetBindingString(0, gamepadActive), GetBindingString(1, gamepadActive), GetBindingString(2, gamepadActive), GetBindingString(3, gamepadActive), GetBindingString(4, gamepadActive), gamepadActive); } }