Files
Deroc_Virtual_3D/Assets/FPS/Scripts/UI/InGameMenuManager.cs
T
Alex38Lyon 878ea46cac update
2025-06-03 12:00:47 +02:00

154 lines
5.0 KiB
C#

using Unity.FPS.Game;
using Unity.FPS.Gameplay;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Unity.FPS.UI
{
public class InGameMenuManager : MonoBehaviour
{
[Tooltip("Root GameObject of the menu used to toggle its activation")]
public GameObject MenuRoot;
[Tooltip("Master volume when menu is open")] [Range(0.001f, 1f)]
public float VolumeWhenMenuOpen = 0.5f;
[Tooltip("Slider component for look sensitivity")]
public Slider LookSensitivitySlider;
[Tooltip("Toggle component for shadows")]
public Toggle ShadowsToggle;
[Tooltip("Toggle component for invincibility")]
public Toggle InvincibilityToggle;
[Tooltip("Toggle component for framerate display")]
public Toggle FramerateToggle;
[Tooltip("GameObject for the controls")]
public GameObject ControlImage;
PlayerInputHandler m_PlayerInputsHandler;
Health m_PlayerHealth;
FramerateCounter m_FramerateCounter;
void Start()
{
m_PlayerInputsHandler = FindFirstObjectByType<PlayerInputHandler>();
DebugUtility.HandleErrorIfNullFindObject<PlayerInputHandler, InGameMenuManager>(m_PlayerInputsHandler,
this);
m_PlayerHealth = m_PlayerInputsHandler.GetComponent<Health>();
DebugUtility.HandleErrorIfNullGetComponent<Health, InGameMenuManager>(m_PlayerHealth, this, gameObject);
m_FramerateCounter = FindFirstObjectByType<FramerateCounter>();
DebugUtility.HandleErrorIfNullFindObject<FramerateCounter, InGameMenuManager>(m_FramerateCounter, this);
MenuRoot.SetActive(false);
LookSensitivitySlider.value = m_PlayerInputsHandler.LookSensitivity;
LookSensitivitySlider.onValueChanged.AddListener(OnMouseSensitivityChanged);
ShadowsToggle.isOn = QualitySettings.shadows != ShadowQuality.Disable;
ShadowsToggle.onValueChanged.AddListener(OnShadowsChanged);
InvincibilityToggle.isOn = m_PlayerHealth.Invincible;
InvincibilityToggle.onValueChanged.AddListener(OnInvincibilityChanged);
FramerateToggle.isOn = m_FramerateCounter.UIText.gameObject.activeSelf;
FramerateToggle.onValueChanged.AddListener(OnFramerateCounterChanged);
}
void Update()
{
// Lock cursor when clicking outside of menu
if (!MenuRoot.activeSelf && Input.GetMouseButtonDown(0))
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
if (Input.GetKeyDown(KeyCode.Escape))
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
if (Input.GetButtonDown(GameConstants.k_ButtonNamePauseMenu)
|| (MenuRoot.activeSelf && Input.GetButtonDown(GameConstants.k_ButtonNameCancel)))
{
if (ControlImage.activeSelf)
{
ControlImage.SetActive(false);
return;
}
SetPauseMenuActivation(!MenuRoot.activeSelf);
}
if (Input.GetAxisRaw(GameConstants.k_AxisNameVertical) != 0)
{
if (EventSystem.current.currentSelectedGameObject == null)
{
EventSystem.current.SetSelectedGameObject(null);
LookSensitivitySlider.Select();
}
}
}
public void ClosePauseMenu()
{
SetPauseMenuActivation(false);
}
void SetPauseMenuActivation(bool active)
{
MenuRoot.SetActive(active);
if (MenuRoot.activeSelf)
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
Time.timeScale = 0f;
AudioUtility.SetMasterVolume(VolumeWhenMenuOpen);
EventSystem.current.SetSelectedGameObject(null);
}
else
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
Time.timeScale = 1f;
AudioUtility.SetMasterVolume(1);
}
}
void OnMouseSensitivityChanged(float newValue)
{
m_PlayerInputsHandler.LookSensitivity = newValue;
}
void OnShadowsChanged(bool newValue)
{
QualitySettings.shadows = newValue ? ShadowQuality.All : ShadowQuality.Disable;
}
void OnInvincibilityChanged(bool newValue)
{
m_PlayerHealth.Invincible = newValue;
}
void OnFramerateCounterChanged(bool newValue)
{
m_FramerateCounter.UIText.gameObject.SetActive(newValue);
}
public void OnShowControlButtonClicked(bool show)
{
ControlImage.SetActive(show);
}
}
}