108 lines
3.3 KiB
C#
108 lines
3.3 KiB
C#
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;
|
||
}
|
||
}
|
||
} |