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 _additionalPrizeIcons = new(); public void Init(int number, Sprite iconCharacter, string name, IReadOnlyList prizes) { numberLabel.text = number.ToString(); characterImage.sprite = iconCharacter; characterNameLabel.text = name; List availablePrizes = prizes? .Where(prize => prize != null && prize is not EmptyPrize) .ToList() ?? new List(); prizeLabel.enableAutoSizing = true; prizeLabel.fontSizeMin = 8f; prizeLabel.text = availablePrizes.Count > 0 ? string.Join("\n", availablePrizes.Select(GetCompactPrizeText)) : "Без приза"; SetupPrizeIcons(availablePrizes); } private void SetupPrizeIcons(IReadOnlyList 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); } }