Добавить таймеры и шкалы прогресса, расширить призовую систему и контроль остатков, восстановить настройки и обновить таблицу призов главного меню.
100 lines
3.3 KiB
C#
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);
|
|
}
|
|
}
|