101 lines
3.7 KiB
C#
101 lines
3.7 KiB
C#
using UnityEngine;
|
||
using UnityEngine.InputSystem;
|
||
using _Project.Scripts.PlayerUtils; // Подключаем пространство имен с нашими модулями игрока
|
||
|
||
namespace _Project.Scripts
|
||
{
|
||
public class UIPanel : MonoBehaviour
|
||
{
|
||
[Header("UI элементы")]
|
||
[SerializeField] private GameObject panel;
|
||
|
||
private bool isInMenu = false;
|
||
|
||
private void Start()
|
||
{
|
||
// Подписываемся на кнопку меню через главный класс Игрока.
|
||
// Теперь нам не нужно создавать свои controls, мы используем общие.
|
||
Player.Instance.Controls.Player.EnterMenu.performed += ctx => ToggleMenu();
|
||
|
||
// Гарантируем, что на старте игры меню закрыто
|
||
CloseMenu();
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
// Отписываемся во избежание утечек памяти
|
||
// Проверка на null нужна на случай закрытия игры, когда Player уже уничтожен
|
||
if (Player.Instance != null && Player.Instance.Controls != null)
|
||
{
|
||
Player.Instance.Controls.Player.EnterMenu.performed -= ctx => ToggleMenu();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Переключатель состояния (открыть / закрыть)
|
||
/// </summary>
|
||
public void ToggleMenu()
|
||
{
|
||
if (isInMenu)
|
||
{
|
||
CloseMenu();
|
||
}
|
||
else
|
||
{
|
||
OpenMenu();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Открытие меню / Пауза
|
||
/// </summary>
|
||
public void OpenMenu()
|
||
{
|
||
isInMenu = true;
|
||
|
||
if (panel != null)
|
||
panel.SetActive(true);
|
||
|
||
// Останавливаем игровое время (физика и FixedUpdate останавливаются автоматически)
|
||
Time.timeScale = 0f;
|
||
|
||
// Освобождаем курсор для кликов по кнопкам и слайдерам
|
||
Cursor.lockState = CursorLockMode.None;
|
||
Cursor.visible = true;
|
||
|
||
// ОТКЛЮЧАЕМ ТОЛЬКО НУЖНЫЕ МОДУЛИ
|
||
// Input System продолжает работать при Time.timeScale = 0,
|
||
// поэтому нам нужно отключить камеру (чтобы не вращалась) и стрельбу (чтобы не стрелял).
|
||
if (Player.Instance != null)
|
||
{
|
||
Player.Instance.CameraController.enabled = false;
|
||
Player.Instance.Combat.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 (Player.Instance != null)
|
||
{
|
||
Player.Instance.CameraController.enabled = true;
|
||
Player.Instance.Combat.enabled = true;
|
||
}
|
||
}
|
||
}
|
||
} |