UnityGameProjectsCode / Rise2Point0Game / Managers / InputManager.cs
InputManager.cs
Raw
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);
    }
}