Danro/Assets/Scripts/UI/MainMenu.cs
Danil Iarosh 4d05d1adbb
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
FEAT: Added new settings system
- Добавил новую систему настроек, возможности:
    - Динамически создает список настроек
    - Сохраняет настройки в JSON-файл
    - Возможность группировать настройки
    - Широкие возможности по кастомизации
    - Применение настроек в реальном времени (частично)
- Добавил префабы для новых элементов настроек
- Изменил поведение игры исходя из нового формата настроек
2026-02-04 14:32:15 +03:00

118 lines
3.7 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.UI;
using TMPro;
using RR.Game2D.Core.Managers;
using RR.Common.Settings;
namespace RR.Common.UI
{
public class MainMenu : MonoBehaviour
{
[Header("Кнопки")]
[SerializeField] private Button newGameButton;
[SerializeField] private Button quitButton;
[Header("Тексты")]
[SerializeField] private TextMeshProUGUI paymentText;
private RR.Common.Managers.PaymentManager _paymentManager;
private RR.Common.Settings.SettingsManager _settingsManager;
private void Start()
{
_paymentManager = RR.Common.Managers.PaymentManager.Instance;
_settingsManager = RR.Common.Settings.SettingsManager.Instance;
Bootstrap();
if (Application.platform == RuntimePlatform.WebGLPlayer)
{
quitButton.gameObject.SetActive(false);
}
if (_paymentManager != null)
_paymentManager.OnCreditsChanged.AddListener(OnCreditsChanged);
if (_settingsManager != null)
{
_settingsManager.OnSettingsLoaded += OnSettingsChanged;
_settingsManager.OnSettingsSaved += OnSettingsChanged;
}
}
private void OnDestroy()
{
if (_paymentManager != null)
_paymentManager.OnCreditsChanged.RemoveListener(OnCreditsChanged);
if (_settingsManager != null)
{
_settingsManager.OnSettingsLoaded -= OnSettingsChanged;
_settingsManager.OnSettingsSaved -= OnSettingsChanged;
}
}
/// <summary>
/// Метод для загрузки элементов сцены.
/// Вешает события на кнопки
/// </summary>
private void Bootstrap()
{
if (newGameButton)
{
newGameButton.onClick.AddListener(OnNewGame);
// Устанавливаем начальное состояние кнопки
UpdatePlayButtonState();
}
if (quitButton) quitButton.onClick.AddListener(OnQuit);
}
/// <summary>
/// Метод начала новой игры
/// </summary>
private static void OnNewGame()
{
GameManager.Instance.NewGame();
}
/// <summary>
/// Метод выхода из игры
/// </summary>
private static void OnQuit()
{
Application.Quit();
}
private void OnCreditsChanged(int credits)
{
UpdatePlayButtonState(credits);
}
private void OnSettingsChanged()
{
UpdatePlayButtonState();
}
private void UpdatePlayButtonState(int credits = -1)
{
if (credits < 0)
credits = _paymentManager?.CreditsCount ?? 0;
// Проверяем только через SettingsManager, так как PaymentManager обновляется с задержкой
if (_settingsManager != null && _settingsManager.GetBool("payment.freeGame"))
{
newGameButton.interactable = true;
paymentText.gameObject.SetActive(false);
return;
}
paymentText.gameObject.SetActive(true);
if (!newGameButton) return;
bool canStartGame = credits >= 1;
newGameButton.interactable = canStartGame;
paymentText.gameObject.SetActive(!canStartGame);
}
}
}