sega 826ff5782a Доработать игровые режимы, призы и настройки
Добавить таймеры и шкалы прогресса, расширить призовую систему и контроль остатков, восстановить настройки и обновить таблицу призов главного меню.
2026-09-14 10:47:25 +03:00

100 lines
3.3 KiB
C#

using TMPro;
using UnityEngine;
using UnityEngine.UI;
using PrizeSystem;
using System.Collections.Generic;
using System.Linq;
public class PrizeRecord : MonoBehaviour
{
public RectTransform movableGroup;
[SerializeField] private TextMeshProUGUI numberLabel;
[SerializeField] private Image characterImage;
[SerializeField] private TextMeshProUGUI characterNameLabel;
[SerializeField] private TextMeshProUGUI prizeLabel;
[SerializeField] private Image prizeIconImage;
[SerializeField] private CanvasGroup prizeCell;
private const float PrizeIconSize = 22f;
private const float PrizeIconSpacing = 3f;
private readonly List<Image> _additionalPrizeIcons = new();
public void Init(int number, Sprite iconCharacter, string name, IReadOnlyList<Prize> prizes)
{
numberLabel.text = number.ToString();
characterImage.sprite = iconCharacter;
characterNameLabel.text = name;
List<Prize> availablePrizes = prizes?
.Where(prize => prize != null && prize is not EmptyPrize)
.ToList() ?? new List<Prize>();
prizeLabel.enableAutoSizing = true;
prizeLabel.fontSizeMin = 8f;
prizeLabel.text = availablePrizes.Count > 0
? string.Join("\n", availablePrizes.Select(GetCompactPrizeText))
: "Без приза";
SetupPrizeIcons(availablePrizes);
}
private void SetupPrizeIcons(IReadOnlyList<Prize> prizes)
{
ClearAdditionalPrizeIcons();
bool hasPrizes = prizes.Count > 0;
prizeCell.alpha = hasPrizes ? 1f : 0f;
prizeIconImage.gameObject.SetActive(hasPrizes);
if (hasPrizes == false)
return;
float totalWidth = prizes.Count * PrizeIconSize + (prizes.Count - 1) * PrizeIconSpacing;
float startX = -totalWidth * 0.5f + PrizeIconSize * 0.5f;
for (int i = 0; i < prizes.Count; i++)
{
Image icon = i == 0
? prizeIconImage
: Instantiate(prizeIconImage, prizeCell.transform);
icon.name = $"Prize icon {i + 1}";
icon.sprite = PrizeSystemManager.GetPrizeIcon(prizes[i].PrizeType);
icon.preserveAspect = true;
icon.gameObject.SetActive(true);
RectTransform iconTransform = icon.rectTransform;
iconTransform.anchorMin = new Vector2(0.5f, 0.5f);
iconTransform.anchorMax = new Vector2(0.5f, 0.5f);
iconTransform.pivot = new Vector2(0.5f, 0.5f);
iconTransform.anchoredPosition = new Vector2(startX + i * (PrizeIconSize + PrizeIconSpacing), 0f);
iconTransform.sizeDelta = Vector2.one * PrizeIconSize;
iconTransform.localScale = Vector3.one;
if (i > 0)
_additionalPrizeIcons.Add(icon);
}
}
private void ClearAdditionalPrizeIcons()
{
foreach (Image icon in _additionalPrizeIcons)
{
icon.gameObject.SetActive(false);
Destroy(icon.gameObject);
}
_additionalPrizeIcons.Clear();
}
private static string GetCompactPrizeText(Prize prize)
{
if (prize is VitrinaPrize vitrinaPrize)
return $"Витрина: {string.Join(" | ", vitrinaPrize.Boxes)}";
return PrizeView.GetPrizeText(prize);
}
}