using UnityEngine;
using UnityEngine.InputSystem;
namespace _Project.Scripts
{
public class UIPanel : MonoBehaviour
{
[Header("UI элементы")]
[SerializeField] private GameObject panel;
[Header("Игрок (чтобы отключить вращение камеры в паузе)")]
[SerializeField] private PlayerController playerController;
private PlayerControls controls;
private bool isInMenu = false;
private void Awake()
{
controls = new PlayerControls();
// Подписываемся ОДИН раз при создании, а не в Update
controls.Player.EnterMenu.performed += ctx => ToggleMenu();
}
private void OnEnable()
{
// Обязательно включаем карту действий
controls.Player.Enable();
}
private void OnDisable()
{
// Отключаем ввод при деактивации объекта
controls.Player.Disable();
}
private void OnDestroy()
{
// Отписываемся во избежание утечек памяти
controls.Player.EnterMenu.performed -= ctx => ToggleMenu();
}
private void Start()
{
// Гарантируем, что на старте игры меню закрыто
CloseMenu();
}
///
/// Переключатель состояния (открыть / закрыть)
///
public void ToggleMenu()
{
if (isInMenu)
{
CloseMenu();
}
else
{
OpenMenu();
}
}
///
/// Открытие меню / Пауза
///
public void OpenMenu()
{
isInMenu = true;
if (panel != null)
panel.SetActive(true);
// Останавливаем игровое время (физика, таймеры)
Time.timeScale = 0f;
// Освобождаем курсор для кликов по кнопкам и слайдерам
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
// Отключаем скрипт игрока, чтобы мышь не вертела камеру во время настройки
if (playerController != null)
playerController.enabled = false;
}
///
/// Закрытие меню (можно привязать к кнопке "Продолжить" в UI)
///
public void CloseMenu()
{
isInMenu = false;
if (panel != null)
panel.SetActive(false);
// Возобновляем время
Time.timeScale = 1f;
// Прячем и лочим курсор обратно в прицел
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
// Возвращаем управление игроку
if (playerController != null)
playerController.enabled = true;
}
}
}