StationObscurum/Assets/Packages/Heat - Complete Modern UI/Scripts/Input/ControllerManager.cs
2024-02-01 22:45:59 -05:00

237 lines
9.2 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.DualShock;
using UnityEngine.InputSystem.XInput;
namespace Michsky.UI.Heat
{
[DefaultExecutionOrder(-100)]
[DisallowMultipleComponent]
public class ControllerManager : MonoBehaviour
{
// Static Instance
public static ControllerManager instance;
// Resources
public ControllerPresetManager presetManager;
public GameObject firstSelected;
public List<PanelManager> panels = new List<PanelManager>();
public List<ButtonManager> buttons = new List<ButtonManager>();
public List<BoxButtonManager> boxButtons = new List<BoxButtonManager>();
public List<ShopButtonManager> shopButtons = new List<ShopButtonManager>();
public List<SettingsElement> settingsElements = new List<SettingsElement>();
[Tooltip("Objects in this list will be enabled when the gamepad is un-plugged.")]
public List<GameObject> keyboardObjects = new List<GameObject>();
[Tooltip("Objects in this list will be enabled when the gamepad is plugged.")]
public List<GameObject> gamepadObjects = new List<GameObject>();
public List<HotkeyEvent> hotkeyObjects = new List<HotkeyEvent>();
// Settings
[Tooltip("Checks for input changes each frame.")]
public bool alwaysUpdate = true;
public bool affectCursor = true;
public InputAction gamepadHotkey;
// Helpers
Vector3 cursorPos;
Vector3 lastCursorPos;
Navigation customNav = new Navigation();
[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;
void Awake()
{
instance = this;
}
void Start()
{
InitInput();
}
void Update()
{
if (!alwaysUpdate)
return;
CheckForController();
CheckForEmptyObject();
}
void InitInput()
{
gamepadHotkey.Enable();
if (Gamepad.current == null) { gamepadConnected = false; SwitchToKeyboard(); }
else { gamepadConnected = true; SwitchToGamepad(); }
}
void CheckForEmptyObject()
{
if (!gamepadEnabled) { return; }
else if (EventSystem.current.currentSelectedGameObject != null && EventSystem.current.currentSelectedGameObject.gameObject.activeInHierarchy) { return; }
if (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();
}
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(); }
}
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)
continue;
keyboardObjects[i].SetActive(false);
}
for (int i = 0; i < gamepadObjects.Count; i++)
{
if (gamepadObjects[i] == null)
continue;
gamepadObjects[i].SetActive(true);
LayoutRebuilder.ForceRebuildLayoutImmediate(gamepadObjects[i].GetComponentInParent<RectTransform>());
}
customNav.mode = Navigation.Mode.Automatic;
for (int i = 0; i < buttons.Count; i++) { if (buttons[i] != null && !buttons[i].useUINavigation) { buttons[i].AddUINavigation(); } }
for (int i = 0; i < boxButtons.Count; i++) { if (boxButtons[i] != null && !boxButtons[i].useUINavigation) { boxButtons[i].AddUINavigation(); } }
for (int i = 0; i < shopButtons.Count; i++) { if (shopButtons[i] != null && !shopButtons[i].useUINavigation) { shopButtons[i].AddUINavigation(); } }
for (int i = 0; i < settingsElements.Count; i++) { if (settingsElements[i] != null && !settingsElements[i].useUINavigation) { settingsElements[i].AddUINavigation(); } }
gamepadEnabled = true;
keyboardEnabled = false;
lastCursorPos = Mouse.current.position.ReadValue();
CheckForGamepadType();
CheckForCurrentObject();
}
void CheckForGamepadType()
{
currentController = Gamepad.current.displayName;
// Search for main and custom gameapds
if (Gamepad.current is XInputController && presetManager != null && presetManager.xboxPreset != null) { currentControllerPreset = presetManager.xboxPreset; }
#if !UNITY_WEBGL && !UNITY_IOS && !UNITY_ANDROID && !UNITY_STANDALONE_LINUX
else if (Gamepad.current is DualSenseGamepadHID && presetManager != null && presetManager.dualsensePreset != null) { currentControllerPreset = presetManager.dualsensePreset; }
#endif
else
{
for (int i = 0; i < presetManager.customPresets.Count; i++)
{
if (currentController == presetManager.customPresets[i].controllerName)
{
currentControllerPreset = presetManager.customPresets[i];
break;
}
}
}
foreach (HotkeyEvent he in hotkeyObjects)
{
if (he == null)
continue;
he.controllerPreset = currentControllerPreset;
he.UpdateUI();
}
}
public void SwitchToKeyboard()
{
if (affectCursor) { Cursor.visible = true; }
if (presetManager != null && presetManager.keyboardPreset != null)
{
currentControllerPreset = presetManager.keyboardPreset;
foreach (HotkeyEvent he in hotkeyObjects)
{
if (he == null)
continue;
he.controllerPreset = currentControllerPreset;
he.UpdateUI();
}
}
for (int i = 0; i < gamepadObjects.Count; i++)
{
if (gamepadObjects[i] == null)
continue;
gamepadObjects[i].SetActive(false);
}
for (int i = 0; i < keyboardObjects.Count; i++)
{
if (keyboardObjects[i] == null)
continue;
keyboardObjects[i].SetActive(true);
LayoutRebuilder.ForceRebuildLayoutImmediate(keyboardObjects[i].GetComponentInParent<RectTransform>());
}
customNav.mode = Navigation.Mode.None;
for (int i = 0; i < buttons.Count; i++) { if (buttons[i] != null && !buttons[i].useUINavigation) { buttons[i].DisableUINavigation(); } }
for (int i = 0; i < boxButtons.Count; i++) { if (boxButtons[i] != null && !boxButtons[i].useUINavigation) { boxButtons[i].DisableUINavigation(); } }
for (int i = 0; i < shopButtons.Count; i++) { if (shopButtons[i] != null && !shopButtons[i].useUINavigation) { shopButtons[i].DisableUINavigation(); } }
for (int i = 0; i < settingsElements.Count; i++) { if (settingsElements[i] != null && !settingsElements[i].useUINavigation) { settingsElements[i].DisableUINavigation(); } }
gamepadEnabled = false;
keyboardEnabled = true;
}
public void SelectUIObject(GameObject tempObj)
{
if (!gamepadEnabled)
return;
EventSystem.current.SetSelectedGameObject(tempObj.gameObject);
}
}
}