Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
Система выдачи призов хоппером: - PrizeSystemManager теперь читает enableHopper из настройки prizes.giveSmallPrize вместо захардкоженного SerializeField (реагирует на изменения в реальном времени) - LevelFinish: исправлен ключ настройки на prizes.giveSmallPrize - Добавлен HopperCheckController для тестирования выдачи приза кнопкой в настройках - Проверка датчика хоппера перенесена в ComDeviceClient (2-й бит INPUT) - PrizeGivenBuffer заменён с PlayerPrefs на потокобезопасный Interlocked-буфер (исправлен краш при вызове PlayerPrefs из фонового потока платы) - Добавлен PrizeSystem.OnPrizeResult (Action<bool>) — событие результата выдачи Отображение ошибки выдачи приза: - Добавлен PrizeErrorDisplay — UI-компонент, подписанный на OnPrizeResult - Зависит от настройки prizes.showPrizeError (реагирует на изменения в реальном времени) QR-коды: - PrizeSystemManager подписан на изменение prizes.phoneNumber — QR-коды перегенерируются автоматически при смене номера - WinBannerController показывает QR-коды только при включённой prizes.giveBigPrize Прочее: - Добавлен Levitator — компонент плавной левитации объекта (высота, скорость, плавность) - Настройки: группы поддержки/тестов реорганизованы, добавлена кнопка btn.hopper_test
141 lines
4.7 KiB
C#
141 lines
4.7 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using TMPro;
|
||
|
||
using RR.Common.Managers;
|
||
using RR.Common.Settings;
|
||
using RR.Game2D.Core.Managers;
|
||
|
||
namespace RR.Common.UI
|
||
{
|
||
/// <summary>
|
||
/// Контроллер баннера выигрыша.
|
||
/// Модальное окно, которое отображается при победе игрока.
|
||
/// </summary>
|
||
public class WinBannerController : Modal
|
||
{
|
||
[Header("Элементы баннера выигрыша")]
|
||
[SerializeField] private TextMeshProUGUI winText;
|
||
[SerializeField] private Button mainMenuButton;
|
||
|
||
[Header("QR-коды")]
|
||
[Tooltip("Контейнер для размещения QR-кодов. QR-коды создаются динамически.")]
|
||
[SerializeField] private RectTransform qrCodesContainer;
|
||
|
||
/// <summary>
|
||
/// Событие, вызываемое при закрытии баннера выигрыша.
|
||
/// </summary>
|
||
public event Action WinBannerDismissed;
|
||
|
||
private readonly List<GameObject> _createdQRCodeObjects = new();
|
||
|
||
protected override void Awake()
|
||
{
|
||
base.Awake();
|
||
|
||
if (mainMenuButton)
|
||
{
|
||
mainMenuButton.onClick.AddListener(OnMainMenuClicked);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Показывает баннер выигрыша с указанным временем игры.
|
||
/// </summary>
|
||
/// <param name="gameTime">Время игры в секундах</param>
|
||
public void ShowWin(float gameTime)
|
||
{
|
||
if (winText)
|
||
{
|
||
winText.text = $"Время игры: {TimeFormatHelper.FormatTime(gameTime)}";
|
||
}
|
||
|
||
// Отображаем QR-коды
|
||
DisplayQRCodes();
|
||
|
||
Open();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Отображает QR-коды из PrizeSystemManager.
|
||
/// Создаёт объекты полностью динамически без префаба.
|
||
/// </summary>
|
||
private void DisplayQRCodes()
|
||
{
|
||
// Очищаем ранее созданные QR-коды
|
||
ClearQRCodes();
|
||
|
||
if (qrCodesContainer == null) return;
|
||
|
||
// Проверяем настройку показа QR-кодов
|
||
if (SettingsManager.Instance == null || !SettingsManager.Instance.GetBool("prizes.giveBigPrize"))
|
||
return;
|
||
|
||
if (PrizeSystemManager.Instance == null) return;
|
||
|
||
Texture2D[] qrCodes = PrizeSystemManager.Instance.GetQRCodes();
|
||
if (qrCodes == null || qrCodes.Length == 0) return;
|
||
|
||
// Создаём QR-коды динамически
|
||
foreach (Texture2D qrTexture in qrCodes)
|
||
{
|
||
if (qrTexture == null) continue;
|
||
|
||
// Создаём GameObject с Image
|
||
GameObject qrObject = new GameObject("QRCode", typeof(RectTransform), typeof(Image));
|
||
qrObject.transform.SetParent(qrCodesContainer, false);
|
||
|
||
// Конвертируем Texture2D в Sprite
|
||
Sprite qrSprite = Sprite.Create(
|
||
qrTexture,
|
||
new Rect(0, 0, qrTexture.width, qrTexture.height),
|
||
new Vector2(0.5f, 0.5f)
|
||
);
|
||
|
||
// Настраиваем Image
|
||
Image image = qrObject.GetComponent<Image>();
|
||
image.sprite = qrSprite;
|
||
image.raycastTarget = false;
|
||
|
||
_createdQRCodeObjects.Add(qrObject);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Очищает созданные QR-код объекты.
|
||
/// </summary>
|
||
private void ClearQRCodes()
|
||
{
|
||
foreach (GameObject obj in _createdQRCodeObjects)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
Destroy(obj);
|
||
}
|
||
}
|
||
_createdQRCodeObjects.Clear();
|
||
}
|
||
|
||
private void OnMainMenuClicked()
|
||
{
|
||
Close();
|
||
WinBannerDismissed?.Invoke();
|
||
|
||
if (GameManager.Instance)
|
||
{
|
||
GameManager.Instance.SetPause(false);
|
||
GameManager.Instance.LoadScene("MainMenu", false);
|
||
}
|
||
}
|
||
|
||
protected override void OnDisable()
|
||
{
|
||
base.OnDisable();
|
||
ClearQRCodes();
|
||
}
|
||
}
|
||
}
|
||
|