Souljack/Assets/_Project/Scripts/UIPanel.cs

106 lines
3.8 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;
using _Project.Scripts.PlayerUtils;
using UnityEngine.SceneManagement; // Подключаем пространство имен с нашими модулями игрока
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();
}
}
public void ReloadScene()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
/// <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;
}
}
}
}