using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.DualShock; using UnityEngine.InputSystem.XInput; using UnityEngine.UI; namespace Michsky.UI.Heat { [DefaultExecutionOrder(-100)] [DisallowMultipleComponent] public class ControllerManager : MonoBehaviour { public static ControllerManager instance; public ControllerPresetManager presetManager; public GameObject firstSelected; public List panels = new List(); public List buttons = new List(); public List boxButtons = new List(); public List shopButtons = new List(); public List settingsElements = new List(); [Tooltip("Objects in this list will be enabled when the gamepad is un-plugged.")] public List keyboardObjects = new List(); [Tooltip("Objects in this list will be enabled when the gamepad is plugged.")] public List gamepadObjects = new List(); public List hotkeyObjects = new List(); [Tooltip("Checks for input changes each frame.")] public bool alwaysUpdate = true; public bool affectCursor = true; public InputAction gamepadHotkey; private Vector3 cursorPos; private Vector3 lastCursorPos; private Navigation customNav; [HideInInspector] public int currentManagerIndex; [HideInInspector] public bool gamepadConnected; [HideInInspector] public bool gamepadEnabled; [HideInInspector] public bool keyboardEnabled; [HideInInspector] public float hAxis; [HideInInspector] public float vAxis; [HideInInspector] public string currentController; [HideInInspector] public ControllerPreset currentControllerPreset; private void Awake() { instance = this; } private void Start() { InitInput(); } private void Update() { if (alwaysUpdate) { CheckForController(); CheckForEmptyObject(); } } private void InitInput() { gamepadHotkey.Enable(); if (Gamepad.current == null) { gamepadConnected = false; SwitchToKeyboard(); } else { gamepadConnected = true; SwitchToGamepad(); } } private void CheckForEmptyObject() { if (gamepadEnabled && (!(EventSystem.current.currentSelectedGameObject != null) || !EventSystem.current.currentSelectedGameObject.gameObject.activeInHierarchy) && gamepadHotkey.triggered && panels.Count != 0 && panels[currentManagerIndex].panels[panels[currentManagerIndex].currentPanelIndex].firstSelected != null) { SelectUIObject(panels[currentManagerIndex].panels[panels[currentManagerIndex].currentPanelIndex].firstSelected); } } public void CheckForController() { if (Gamepad.current == null) { gamepadConnected = false; } else { gamepadConnected = true; hAxis = Gamepad.current.rightStick.x.ReadValue(); vAxis = Gamepad.current.rightStick.y.ReadValue(); } if (Mouse.current != null) { cursorPos = Mouse.current.position.ReadValue(); } if (gamepadConnected && gamepadEnabled && !keyboardEnabled && cursorPos != lastCursorPos) { SwitchToKeyboard(); } else if (gamepadConnected && !gamepadEnabled && keyboardEnabled && gamepadHotkey.triggered) { SwitchToGamepad(); } else if (!gamepadConnected && !keyboardEnabled) { SwitchToKeyboard(); } } private void CheckForCurrentObject() { if ((EventSystem.current.currentSelectedGameObject == null || !EventSystem.current.currentSelectedGameObject.activeInHierarchy) && panels.Count != 0) { SelectUIObject(panels[currentManagerIndex].panels[panels[currentManagerIndex].currentPanelIndex].firstSelected); } } public void SwitchToGamepad() { if (affectCursor) { Cursor.visible = false; } for (int i = 0; i < keyboardObjects.Count; i++) { if (!(keyboardObjects[i] == null)) { keyboardObjects[i].SetActive(value: false); } } for (int j = 0; j < gamepadObjects.Count; j++) { if (!(gamepadObjects[j] == null)) { gamepadObjects[j].SetActive(value: true); LayoutRebuilder.ForceRebuildLayoutImmediate(gamepadObjects[j].GetComponentInParent()); } } customNav.mode = Navigation.Mode.Automatic; for (int k = 0; k < buttons.Count; k++) { if (buttons[k] != null && !buttons[k].useUINavigation) { buttons[k].AddUINavigation(); } } for (int l = 0; l < boxButtons.Count; l++) { if (boxButtons[l] != null && !boxButtons[l].useUINavigation) { boxButtons[l].AddUINavigation(); } } for (int m = 0; m < shopButtons.Count; m++) { if (shopButtons[m] != null && !shopButtons[m].useUINavigation) { shopButtons[m].AddUINavigation(); } } for (int n = 0; n < settingsElements.Count; n++) { if (settingsElements[n] != null && !settingsElements[n].useUINavigation) { settingsElements[n].AddUINavigation(); } } gamepadEnabled = true; keyboardEnabled = false; if (Mouse.current != null) { lastCursorPos = Mouse.current.position.ReadValue(); } CheckForGamepadType(); CheckForCurrentObject(); } private void CheckForGamepadType() { if (Gamepad.current == null) { return; } currentController = Gamepad.current.displayName; if (Gamepad.current is XInputController && presetManager != null && presetManager.xboxPreset != null) { currentControllerPreset = presetManager.xboxPreset; } else if (Gamepad.current is DualSenseGamepadHID && presetManager != null && presetManager.dualsensePreset != null) { currentControllerPreset = presetManager.dualsensePreset; } else { for (int i = 0; i < presetManager.customPresets.Count; i++) { if (currentController == presetManager.customPresets[i].controllerName) { currentControllerPreset = presetManager.customPresets[i]; break; } } } foreach (HotkeyEvent hotkeyObject in hotkeyObjects) { if (!(hotkeyObject == null)) { hotkeyObject.controllerPreset = currentControllerPreset; hotkeyObject.UpdateUI(); } } } public void SwitchToKeyboard() { if (affectCursor) { Cursor.visible = true; } if (presetManager != null && presetManager.keyboardPreset != null) { currentControllerPreset = presetManager.keyboardPreset; foreach (HotkeyEvent hotkeyObject in hotkeyObjects) { if (!(hotkeyObject == null)) { hotkeyObject.controllerPreset = currentControllerPreset; hotkeyObject.UpdateUI(); } } } for (int i = 0; i < gamepadObjects.Count; i++) { if (!(gamepadObjects[i] == null)) { gamepadObjects[i].SetActive(value: false); } } for (int j = 0; j < keyboardObjects.Count; j++) { if (!(keyboardObjects[j] == null)) { keyboardObjects[j].SetActive(value: true); LayoutRebuilder.ForceRebuildLayoutImmediate(keyboardObjects[j].GetComponentInParent()); } } customNav.mode = Navigation.Mode.None; for (int k = 0; k < buttons.Count; k++) { if (buttons[k] != null && !buttons[k].useUINavigation) { buttons[k].DisableUINavigation(); } } for (int l = 0; l < boxButtons.Count; l++) { if (boxButtons[l] != null && !boxButtons[l].useUINavigation) { boxButtons[l].DisableUINavigation(); } } for (int m = 0; m < shopButtons.Count; m++) { if (shopButtons[m] != null && !shopButtons[m].useUINavigation) { shopButtons[m].DisableUINavigation(); } } for (int n = 0; n < settingsElements.Count; n++) { if (settingsElements[n] != null && !settingsElements[n].useUINavigation) { settingsElements[n].DisableUINavigation(); } } gamepadEnabled = false; keyboardEnabled = true; } public void SelectUIObject(GameObject tempObj) { if (gamepadEnabled && !(tempObj == null)) { EventSystem.current.SetSelectedGameObject(tempObj.gameObject); } } } }