Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- Добавлена система баланса игры (BalanceManager) для управления внутриигровой валютой - Баланс начисляется за импульсы оплаты и списывается за начало/продолжение игры - При старте игры весь внесенный баланс списывается, а жизни начисляются в соответствии с количеством оплат - Добавлены проверки достаточности баланса для начала и продолжения игры - Интегрирован BalanceManager с PaymentManager и GameManager - Исправлен баг с возможностью снятия паузы при показе баннера проигрыша/победы - Добавлена блокировка переключения паузы через IsActive флаг в PauseMenu - Жизни больше не могут уйти в минус при повторной смерти во время показа баннера - Настройки стоимости импульса, начала и продолжения игры берутся из SettingsManager
165 lines
5.4 KiB
C#
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
|
|
}
|
|
}
|
|
|