- Добавлена система анимированных текстовых сплешей (TextSplash) с настройками масштаба, покачивания, движения и цвета - Добавлена поддержка циклического воспроизведения анимации сплешей - Добавлена настройка частоты покачивания для более плавной и непрерывной анимации - Добавлено отображение валюты в компоненте BalanceDisplay (берется из настройки payment.currency) - Добавлены поля для отображения номера поддержки и суперприза в главном меню - Добавлена возможность форматирования текстов через string.Format в MainMenu (supportNumberFormat, superPrizeFormat) - Валюта и тексты автоматически обновляются при изменении настроек
208 lines
7.0 KiB
C#
208 lines
7.0 KiB
C#
using RR.Common.Managers;
|
||
using RR.Common.Settings;
|
||
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 SettingsManager _settingsManager;
|
||
private Coroutine _animationCoroutine;
|
||
private Vector3 _originalScale;
|
||
private string _currency = "";
|
||
|
||
private void Awake()
|
||
{
|
||
if (balanceText != null)
|
||
{
|
||
_originalScale = balanceText.transform.localScale;
|
||
}
|
||
}
|
||
|
||
private void Start()
|
||
{
|
||
_balanceManager = BalanceManager.Instance;
|
||
_settingsManager = SettingsManager.Instance;
|
||
|
||
// Загружаем валюту из настроек
|
||
if (_settingsManager != null)
|
||
{
|
||
_currency = _settingsManager.GetString("payment.currency");
|
||
_settingsManager.OnSettingsLoaded += OnSettingsChanged;
|
||
_settingsManager.OnSettingsSaved += OnSettingsChanged;
|
||
}
|
||
|
||
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);
|
||
}
|
||
|
||
if (_settingsManager != null)
|
||
{
|
||
_settingsManager.OnSettingsLoaded -= OnSettingsChanged;
|
||
_settingsManager.OnSettingsSaved -= OnSettingsChanged;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Обработчик изменения настроек
|
||
/// </summary>
|
||
private void OnSettingsChanged()
|
||
{
|
||
if (_settingsManager != null)
|
||
{
|
||
_currency = _settingsManager.GetString("payment.currency");
|
||
|
||
// Обновляем отображение с новой валютой
|
||
if (_balanceManager != null)
|
||
{
|
||
UpdateBalanceDisplay(_balanceManager.CurrentBalance);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Обработчик изменения баланса
|
||
/// </summary>
|
||
private void OnBalanceChanged(int newBalance)
|
||
{
|
||
UpdateBalanceDisplay(newBalance);
|
||
|
||
if (animateOnChange && balanceText != null)
|
||
{
|
||
AnimateBalanceChange();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Обновляет текст баланса
|
||
/// </summary>
|
||
private void UpdateBalanceDisplay(int balance)
|
||
{
|
||
if (balanceText != null)
|
||
{
|
||
string balanceStr = string.Format(textFormat, balance);
|
||
|
||
// Добавляем валюту в конце через пробел, если она указана
|
||
if (!string.IsNullOrEmpty(_currency))
|
||
{
|
||
balanceStr += " " + _currency;
|
||
}
|
||
|
||
balanceText.text = balanceStr;
|
||
}
|
||
}
|
||
|
||
/// <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
|
||
}
|
||
}
|
||
|