Danro/Assets/Scripts/Managers/PaymentManager.cs
Danil Iarosh 9555479967 feat(game): implement payment system and UI improvements
- Added PaymentManager integration with GameManager
- Implemented credit-based lives increment system
- Updated UI layout and anchor positions in MainMenu scene
- Added AddCredit input action bindings for keyboard and gamepad
- Refactored GameManager to use StartingLives, MaxLives properties
- Added UICreditsTextController for displaying credits and lives- Fixed prefab initialization order and component dependencies
- Updated ComWrapper serialization and prize checking logic
- Removed obsolete setLivesToDefaultAfterFirstLose setting
- Improved scene loading and player spawn management
2025-11-11 17:51:51 +03:00

217 lines
8.2 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 RR.Common.Behaviour.ScriptableObjects;
using RR.Game2D.Core.Managers;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
namespace RR.Common.Managers
{
/// <summary>
/// Менеджер системы оплаты. Управляет кредитами и интегрируется с ComWrapper.
/// </summary>
public class PaymentManager : MonoBehaviour
{
public static PaymentManager Instance { get; private set; }
[Header("Настройки")]
[SerializeField] private bool saveMoneyBetweenSessions = false;
[SerializeField] private bool enableFreePlay = false;
[Header("Управление")]
[SerializeField] private InputActionReference addCreditAction;
[Header("Состояние")]
public int CreditsCount { get; private set; }
// События для уведомления других систем
public UnityEvent<int> OnCreditsChanged;
public UnityEvent<int> OnCreditAdded;
public UnityEvent<int> OnCreditRemoved;
#region Unity Lifetime
public void Initialize()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
// Инициализация событий
OnCreditsChanged ??= new UnityEvent<int>();
OnCreditAdded ??= new UnityEvent<int>();
OnCreditRemoved ??= new UnityEvent<int>();
// Загрузка кредитов из сохранений
if (!saveMoneyBetweenSessions)
{
PlayerPrefs.SetInt("CoinsCount", 0);
}
CreditsCount = PlayerPrefs.GetInt("CoinsCount", 0);
// Подписка на события ComWrapper
ComWrapper.OnCreditAdded?.AddListener(HandleCreditAdded);
ComWrapper.OnCreditRemoved?.AddListener(HandleCreditRemoved);
// Привязка действия добавления кредита (для тестирования)
if (addCreditAction != null)
{
addCreditAction.action.performed += AddCreditsManually;
addCreditAction.action.Enable();
}
SettingsManager manager = SettingsManager.Instance;
if (manager != null)
{
manager.OnSettingsLoaded += SetFreePlay;
manager.OnSettingsSaved += SetFreePlay;
}
Debug.Log($"Инициализирован. Кредиты: {CreditsCount}, Бесплатная игра: {enableFreePlay}", this);
}
// Если не инициализируется в GameManager, инициализировать тут
// private void Awake()
// {
// Initialize();
// }
private void OnDestroy()
{
// Отписка от событий ComWrapper
ComWrapper.OnCreditAdded?.RemoveListener(HandleCreditAdded);
ComWrapper.OnCreditRemoved?.RemoveListener(HandleCreditRemoved);
// Отключение действия добавления кредита
if (addCreditAction == null) return;
addCreditAction.action.performed -= AddCreditsManually;
addCreditAction.action.Disable();
SettingsManager manager = SettingsManager.Instance;
if (manager == null) return;
manager.OnSettingsLoaded -= SetFreePlay;
manager.OnSettingsSaved -= SetFreePlay;
}
#endregion
#region Private Methods
/// <summary>
/// Обработчик добавления кредита из ComWrapper
/// </summary>
/// <param name="newCreditsCount">Новое количество кредитов</param>
private void HandleCreditAdded(int newCreditsCount)
{
CreditsCount = newCreditsCount;
OnCreditsChanged?.Invoke(CreditsCount);
OnCreditAdded?.Invoke(CreditsCount);
GameManager.Logger?.Log("PaymentManager", $"Кредит добавлен. Всего: {CreditsCount}");
}
/// <summary>
/// Обработчик удаления кредита из ComWrapper
/// </summary>
/// <param name="newCreditsCount">Новое количество кредитов</param>
private void HandleCreditRemoved(int newCreditsCount)
{
CreditsCount = newCreditsCount;
OnCreditsChanged?.Invoke(CreditsCount);
OnCreditRemoved?.Invoke(CreditsCount);
GameManager.Logger?.Log("PaymentManager", $"Кредит удален. Осталось: {CreditsCount}");
}
private void SetFreePlay()
{
if (SettingsManager.Instance == null) return;
GameSettings currentSettings = SettingsManager.Instance.GetCurrentGameSettings();
enableFreePlay = currentSettings.isFreeGame;
Debug.Log($"Бесплатная игра установлена из настроек: {enableFreePlay}", this);
}
#endregion
#region Public API
/// <summary>
/// Проверяет, может ли игрок начать игру (есть ли кредиты или включена бесплатная игра)
/// </summary>
/// <returns>true если игрок может начать игру</returns>
public bool CanStartGame()
{
if (enableFreePlay)
{
GameManager.Logger?.Log("PaymentManager", "Бесплатная игра включена");
return true;
}
bool canStart = CreditsCount > 0;
GameManager.Logger?.Log("PaymentManager", $"Проверка возможности старта: {canStart} (кредиты: {CreditsCount})");
return canStart;
}
/// <summary>
/// Выполняет списание платы за запуск игры через ComWrapper.Pay()
/// </summary>
/// <returns>true если оплата прошла успешно</returns>
public bool ProcessPayment()
{
if (enableFreePlay)
{
GameManager.Logger?.Log("PaymentManager", "Оплата пропущена - бесплатная игра");
return true;
}
bool paymentSuccess = ComWrapper.Pay();
Debug.Log(paymentSuccess ? "Оплата успешна" : "Оплата не прошла - недостаточно кредитов", this);
return paymentSuccess;
}
/// <summary>
/// Добавляет кредиты вручную (для тестирования)
/// </summary>
/// <param name="amount">Количество кредитов</param>
public static void AddCreditsManually(int amount = 1)
{
for (int i = 0; i < amount; i++)
{
ComWrapper.AddCredit();
}
}
private static void AddCreditsManually(InputAction.CallbackContext context)
{
AddCreditsManually();
// OnCreditAdded?.Invoke(CreditsCount);
// OnCreditsChanged?.Invoke(CreditsCount);
}
/// <summary>
/// Включает/выключает режим бесплатной игры
/// </summary>
/// <param name="enable">Включить/выключить</param>
public void SetFreePlayMode(bool enable)
{
enableFreePlay = enable;
GameManager.Logger?.Log("PaymentManager", $"Бесплатная игра: {enableFreePlay}");
}
/// <summary>
/// Получить текущее состояние режима бесплатной игры
/// </summary>
public bool IsFreePlayEnabled() => enableFreePlay;
public void SetFreePlay(bool freePlayEnabled)
{
enableFreePlay = freePlayEnabled;
}
#endregion
}
}