Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- добавлена новая система призов: PrizeBase, PrizeType, PrizeDatabase, LevelPrizeConfig и реализации для hopper, QR-кода, отсутствия приза и стойки с призом - добавлена конфигурация призов уровней через `prizes.json` и связанная логика загрузки/обработки в менеджерах игры - расширен UI главного меню и настроек уровней: добавлены LevelSettingsModal, LevelPrizeSettingsModal, QRCodeModal и PrizeStandModal - обновлена навигация модальных окон и связанный UI-код: ModalManager, MainMenu, RulesModal, PauseMenu, PrizeErrorDisplay, UIRowPointer и WinBannerController - доработаны настройки и генерация UI-элементов: обновлены SettingsDatabase, SettingsUIGenerator, SettingUIItem, ValueSelectorRow и editor drawer для настроек - обновлены и добавлены UI-prefab'ы для кнопок, строк настроек, панели групп и кнопки настроек уровня - обновлены сцены `MainMenu` и `Level UI` под новый флоу настройки уровней, выбора призов и отображения модалок - добавлены файлы лаунчера в `StreamingAssets`, включая `RRLauncher.exe`, служебные meta-файлы и документацию - улучшено логирование через FileLogger и удален устаревший код лицензирования - удалены больше неиспользуемые файлы: `Licensing.cs`, `SteppedSlider.cs` и recovery-сцены
105 lines
3.4 KiB
C#
105 lines
3.4 KiB
C#
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
using RR.Game2D.Core.Managers;
|
||
|
||
namespace RR.Common.UI
|
||
{
|
||
/// <summary>
|
||
/// Модальное окно для отображения QR-кодов.
|
||
/// Создаёт Image-объекты с QR-кодами динамически в указанном контейнере.
|
||
/// </summary>
|
||
public class QRCodeModal : Modal
|
||
{
|
||
/// <summary>Текущий экземпляр на сцене. Регистрируется автоматически.</summary>
|
||
public static QRCodeModal Current { get; private set; }
|
||
|
||
[Header("Контент")]
|
||
[Tooltip("Контейнер для размещения QR-кодов. QR-коды создаются динамически.")]
|
||
[SerializeField] private RectTransform qrCodesContainer;
|
||
|
||
private readonly List<GameObject> _createdObjects = new();
|
||
|
||
protected override void Awake()
|
||
{
|
||
Current = this;
|
||
base.Awake(); // деактивирует GO, но ссылка Current остаётся валидной
|
||
}
|
||
|
||
private void OnDestroy()
|
||
{
|
||
if (Current == this) Current = null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Показывает модальное окно с указанными QR-кодами.
|
||
/// </summary>
|
||
/// <param name="qrTextures">Массив текстур QR-кодов для отображения.</param>
|
||
public void ShowQRCodes(Texture2D[] qrTextures)
|
||
{
|
||
ClearQRCodes();
|
||
|
||
if (qrCodesContainer == null)
|
||
{
|
||
Debug.LogWarning("[QRCodeModal] Контейнер для QR-кодов не назначен.");
|
||
return;
|
||
}
|
||
|
||
if (qrTextures == null || qrTextures.Length == 0)
|
||
{
|
||
Debug.LogWarning("[QRCodeModal] Нет QR-кодов для отображения.");
|
||
return;
|
||
}
|
||
|
||
foreach (Texture2D tex in qrTextures)
|
||
{
|
||
if (tex == null) continue;
|
||
|
||
GameObject qrObj = new GameObject("QRCode", typeof(RectTransform), typeof(Image));
|
||
qrObj.transform.SetParent(qrCodesContainer, false);
|
||
|
||
Sprite sprite = Sprite.Create(
|
||
tex,
|
||
new Rect(0, 0, tex.width, tex.height),
|
||
new Vector2(0.5f, 0.5f));
|
||
|
||
Image image = qrObj.GetComponent<Image>();
|
||
image.sprite = sprite;
|
||
image.raycastTarget = false;
|
||
|
||
_createdObjects.Add(qrObj);
|
||
}
|
||
|
||
Open();
|
||
GameManager.Instance?.SetPause(true);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Очищает созданные QR-код объекты.
|
||
/// </summary>
|
||
private void ClearQRCodes()
|
||
{
|
||
foreach (GameObject obj in _createdObjects)
|
||
{
|
||
if (obj != null) Destroy(obj);
|
||
}
|
||
_createdObjects.Clear();
|
||
}
|
||
|
||
public override void Close()
|
||
{
|
||
base.Close();
|
||
ClearQRCodes();
|
||
GameManager.Instance?.SetPause(false);
|
||
}
|
||
|
||
protected override void OnDisable()
|
||
{
|
||
base.OnDisable();
|
||
ClearQRCodes();
|
||
GameManager.Instance?.SetPause(false);
|
||
}
|
||
}
|
||
}
|