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; } } }