Souljack/Assets/_Project/Scripts/UIPanel.cs
2026-09-19 03:43:12 +03:00

108 lines
3.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
/// <summary>
/// Переключатель состояния (открыть / закрыть)
/// </summary>
public void ToggleMenu()
{
if (isInMenu)
{
CloseMenu();
}
else
{
OpenMenu();
}
}
/// <summary>
/// Открытие меню / Пауза
/// </summary>
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;
}
/// <summary>
/// Закрытие меню (можно привязать к кнопке "Продолжить" в UI)
/// </summary>
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;
}
}
}