Files
HauntedBloodlines/Assets/Scripts/Managers/EventSystemController.cs
2025-05-29 22:31:40 +03:00

178 lines
6.3 KiB
C#

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<EventSystem>();
standaloneInputModule = FindObjectOfType<StandaloneInputModule>();
}
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<Selectable>().FindSelectableOnRight();
if (nextButton != null)
{
EventSystem.current.SetSelectedGameObject(nextButton.gameObject);
canNavigate = false;
}
}
else if (horizontalInput < -0.1f)
{
Selectable nextButton = EventSystem.current.currentSelectedGameObject.GetComponent<Selectable>().FindSelectableOnLeft();
if (nextButton != null)
{
EventSystem.current.SetSelectedGameObject(nextButton.gameObject);
canNavigate = false;
}
}
else if (verticalInput > 0.1f)
{
Selectable nextButton = EventSystem.current.currentSelectedGameObject.GetComponent<Selectable>().FindSelectableOnUp();
if (nextButton != null)
{
EventSystem.current.SetSelectedGameObject(nextButton.gameObject);
canNavigate = false;
}
}
else if (verticalInput < -0.1f)
{
Selectable nextButton = EventSystem.current.currentSelectedGameObject.GetComponent<Selectable>().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<Slider>();
if (slider != null)
{
return slider;
}
}
return null; // No slider is currently selected
}
}