using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class EventSystemController : MonoBehaviour { public GameObject firstSelectedButton; [SerializeField] private EventSystem eventSystem; [SerializeField] private StandaloneInputModule standaloneInputModule; public float navigationDelay = 0.2f; // Delay between button selections private float navigationTimer = 0f; private bool canNavigate = true; public Slider lastSelectedSlider; public float dpadSensitivity = 0.1f; private bool updateControllerControls = true; private bool updateKeyboardMouseControls = true; private static EventSystemController _instance; public static EventSystemController GetInstance() { return _instance; } private void Awake() { if (!_instance) { _instance = this; } } private void Start() { eventSystem = FindObjectOfType(); standaloneInputModule = FindObjectOfType(); } private void Update() { if (InputControlManager.Getinstance().IsUsingJoystick) { if (updateControllerControls) { eventSystem.SetSelectedGameObject(firstSelectedButton); standaloneInputModule.horizontalAxis = "Joystick Horizontal"; standaloneInputModule.verticalAxis = "Joystick Vertical"; updateKeyboardMouseControls = true; updateControllerControls = false; } } else { if (updateKeyboardMouseControls) { eventSystem.SetSelectedGameObject(firstSelectedButton); standaloneInputModule.horizontalAxis = "Horizontal"; standaloneInputModule.verticalAxis = "Vertical"; updateKeyboardMouseControls = false; updateControllerControls = true; } } //if (EventSystem.current.currentSelectedGameObject == null) //{ // EventSystem.current.SetSelectedGameObject(firstSelectedButton); //} // Read input values for navigation axes float horizontalInput = Input.GetAxis("DpadHorizontal"); float verticalInput = Input.GetAxis("DpadVertical"); // Check if enough time has passed to allow button navigation if (!canNavigate) { navigationTimer += Time.unscaledDeltaTime; if (navigationTimer >= navigationDelay) { canNavigate = true; navigationTimer = 0f; } } // Select the next button based on the input values if (canNavigate) { if (EventSystem.current.currentSelectedGameObject != null) { if (horizontalInput > 0.1f) { Selectable nextButton = EventSystem.current.currentSelectedGameObject.GetComponent().FindSelectableOnRight(); if (nextButton != null) { EventSystem.current.SetSelectedGameObject(nextButton.gameObject); canNavigate = false; } } else if (horizontalInput < -0.1f) { Selectable nextButton = EventSystem.current.currentSelectedGameObject.GetComponent().FindSelectableOnLeft(); if (nextButton != null) { EventSystem.current.SetSelectedGameObject(nextButton.gameObject); canNavigate = false; } } else if (verticalInput > 0.1f) { Selectable nextButton = EventSystem.current.currentSelectedGameObject.GetComponent().FindSelectableOnUp(); if (nextButton != null) { EventSystem.current.SetSelectedGameObject(nextButton.gameObject); canNavigate = false; } } else if (verticalInput < -0.1f) { Selectable nextButton = EventSystem.current.currentSelectedGameObject.GetComponent().FindSelectableOnDown(); if (nextButton != null) { EventSystem.current.SetSelectedGameObject(nextButton.gameObject); canNavigate = false; } } // Find currently selected slider Slider selectedSlider = FindSelectedSlider(); // If a slider is selected and it's different from the last selected one, update the last selected slider if (selectedSlider != null && selectedSlider != lastSelectedSlider) { lastSelectedSlider = selectedSlider; } // If no slider is selected, set lastSelectedSlider to null if (selectedSlider == null) { lastSelectedSlider = null; } // If a slider is selected, adjust its value based on D-pad input if (lastSelectedSlider != null) { if (Mathf.Abs(horizontalInput) > dpadSensitivity) { lastSelectedSlider.value -= horizontalInput; } //else if (Mathf.Abs(verticalInput) > dpadSensitivity) //{ // lastSelectedSlider.value += verticalInput; //} } } } } Slider FindSelectedSlider() { // Get the currently selected game object GameObject selectedGameObject = EventSystem.current.currentSelectedGameObject; // If the selected game object is a slider, return it if (selectedGameObject != null) { Slider slider = selectedGameObject.GetComponent(); if (slider != null) { return slider; } } return null; // No slider is currently selected } }