Danro/Assets/Scripts/UI/MainMenu.cs
Danil Iarosh 3944534cd0
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
feat: Implement balance system and fix pause bug
- Добавлена система баланса игры (BalanceManager) для управления внутриигровой валютой
- Баланс начисляется за импульсы оплаты и списывается за начало/продолжение игры
- При старте игры весь внесенный баланс списывается, а жизни начисляются в соответствии с количеством оплат
- Добавлены проверки достаточности баланса для начала и продолжения игры
- Интегрирован BalanceManager с PaymentManager и GameManager
- Исправлен баг с возможностью снятия паузы при показе баннера проигрыша/победы
- Добавлена блокировка переключения паузы через IsActive флаг в PauseMenu
- Жизни больше не могут уйти в минус при повторной смерти во время показа баннера
- Настройки стоимости импульса, начала и продолжения игры берутся из SettingsManager
2026-02-09 11:31:34 +03:00

116 lines
3.6 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. 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.BalanceManager _balanceManager;
private RR.Common.Settings.SettingsManager _settingsManager;
private void Start()
{
_balanceManager = RR.Common.Managers.BalanceManager.Instance;
_settingsManager = RR.Common.Settings.SettingsManager.Instance;
Bootstrap();
if (Application.platform == RuntimePlatform.WebGLPlayer)
{
quitButton.gameObject.SetActive(false);
}
if (_balanceManager != null)
_balanceManager.OnBalanceChanged.AddListener(OnBalanceChanged);
if (_settingsManager != null)
{
_settingsManager.OnSettingsLoaded += OnSettingsChanged;
_settingsManager.OnSettingsSaved += OnSettingsChanged;
}
}
private void OnDestroy()
{
if (_balanceManager != null)
_balanceManager.OnBalanceChanged.RemoveListener(OnBalanceChanged);
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 OnBalanceChanged(int balance)
{
UpdatePlayButtonState();
}
private void OnSettingsChanged()
{
UpdatePlayButtonState();
}
private void UpdatePlayButtonState()
{
if (!newGameButton) return;
// Проверяем бесплатную игру
if (_settingsManager != null && _settingsManager.GetBool("payment.freeGame"))
{
newGameButton.interactable = true;
paymentText.gameObject.SetActive(false);
return;
}
// Проверяем баланс через BalanceManager
bool canStartGame = _balanceManager != null && _balanceManager.CanStartGame();
newGameButton.interactable = canStartGame;
paymentText.gameObject.SetActive(!canStartGame);
}
}
}