Danro/Assets/Scripts/UI/BalanceDisplay.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

165 lines
5.4 KiB
C#

using RR.Common.Managers;
using TMPro;
using UnityEngine;
namespace RR.Common.UI
{
/// <summary>
/// UI компонент для отображения текущего баланса игрока.
/// Автоматически обновляется при изменении баланса.
/// </summary>
public class BalanceDisplay : MonoBehaviour
{
[Header("Настройки отображения")]
[SerializeField] private TextMeshProUGUI balanceText;
[SerializeField] private string textFormat = "Текущий баланс: {0}";
[Header("Опциональная анимация")]
[SerializeField] private bool animateOnChange = true;
[SerializeField] private float animationDuration = 0.3f;
[SerializeField] private AnimationCurve scaleCurve = AnimationCurve.EaseInOut(0, 1, 1, 1);
private BalanceManager _balanceManager;
private Coroutine _animationCoroutine;
private Vector3 _originalScale;
private void Awake()
{
if (balanceText != null)
{
_originalScale = balanceText.transform.localScale;
}
}
private void Start()
{
_balanceManager = BalanceManager.Instance;
if (_balanceManager != null)
{
// Подписываемся на события изменения баланса
_balanceManager.OnBalanceChanged.AddListener(OnBalanceChanged);
// Устанавливаем начальное значение
UpdateBalanceDisplay(_balanceManager.CurrentBalance);
}
else
{
Debug.LogWarning("[BalanceDisplay] BalanceManager not found! Balance display will not work.");
if (balanceText != null)
{
balanceText.text = string.Format(textFormat, 0);
}
}
}
private void OnDestroy()
{
if (_balanceManager != null)
{
_balanceManager.OnBalanceChanged.RemoveListener(OnBalanceChanged);
}
}
/// <summary>
/// Обработчик изменения баланса
/// </summary>
private void OnBalanceChanged(int newBalance)
{
UpdateBalanceDisplay(newBalance);
if (animateOnChange && balanceText != null)
{
AnimateBalanceChange();
}
}
/// <summary>
/// Обновляет текст баланса
/// </summary>
private void UpdateBalanceDisplay(int balance)
{
if (balanceText != null)
{
balanceText.text = string.Format(textFormat, balance);
}
}
/// <summary>
/// Анимирует изменение баланса (масштабирование)
/// </summary>
private void AnimateBalanceChange()
{
if (_animationCoroutine != null)
{
StopCoroutine(_animationCoroutine);
}
_animationCoroutine = StartCoroutine(ScaleAnimation());
}
private System.Collections.IEnumerator ScaleAnimation()
{
float elapsed = 0f;
while (elapsed < animationDuration)
{
elapsed += Time.unscaledDeltaTime;
float t = elapsed / animationDuration;
// Применяем кривую анимации
float scaleMultiplier = scaleCurve.Evaluate(t);
// Небольшое увеличение и возврат к исходному размеру
float scale = Mathf.Lerp(1.2f, 1f, t);
balanceText.transform.localScale = _originalScale * scale * scaleMultiplier;
yield return null;
}
// Гарантируем возврат к исходному масштабу
balanceText.transform.localScale = _originalScale;
_animationCoroutine = null;
}
/// <summary>
/// Принудительное обновление отображения (для отладки)
/// </summary>
public void ForceUpdate()
{
if (_balanceManager != null)
{
UpdateBalanceDisplay(_balanceManager.CurrentBalance);
}
}
/// <summary>
/// Изменить формат отображения текста
/// </summary>
public void SetTextFormat(string format)
{
textFormat = format;
if (_balanceManager != null)
{
UpdateBalanceDisplay(_balanceManager.CurrentBalance);
}
}
#if UNITY_EDITOR
/// <summary>
/// Для предварительного просмотра в редакторе
/// </summary>
private void OnValidate()
{
if (Application.isPlaying) return;
if (balanceText != null)
{
balanceText.text = string.Format(textFormat, 0);
}
}
#endif
}
}