PJ/Assets/scripts/dotfs_scripts/UI_ShopWindow.cs

105 lines
3.3 KiB
C#
Raw Normal View History

using System.Collections.Generic;
using UnityEngine;
// Наследуемся от твоего базового класса окон, как это сделано в UI_MailWindow
public class UI_ShopWindow : UI_WindowBase
{
private MANAGER_Shop ShopSystem => MANAGER_WindowsBase.Instance.ShopSystem;
private MANAGER_UI UI => MANAGER_WindowsBase.Instance.UI;
[Header("Shop Window Elements")]
[SerializeField] private Transform itemsContainer; // Контейнер с Grid Layout Group
[SerializeField] private UI_ShopItem shopItemPrefab; // Твой префаб слота
// Пул объектов для оптимизации (чтобы избежать Instantiate/Destroy)
private List<UI_ShopItem> _itemPool = new List<UI_ShopItem>();
private string _currentCategory;
// Опционально: если MANAGER_GameEvents имеет событие OnUIUpdate,
// подпишись на него, чтобы витрина перестраивалась автоматически после покупки.
protected override void Awake()
{
base.Awake();
MANAGER_GameEvents.OnUIUpdateNeeded += RefreshStore;
}
private void OnDestroy()
{
MANAGER_GameEvents.OnUIUpdateNeeded -= RefreshStore;
}
/// <summary>
/// Этот метод вызывается из твоего MANAGER_UI
/// </summary>
public void OpenCategory(string category)
{
_currentCategory = category;
base.OpenWindow();
RefreshStore();
}
/// <summary>
/// Отрисовка и обновление магазина с использованием пула объектов
/// </summary>
public void RefreshStore()
{
var ShopSystem = MANAGER_WindowsBase.Instance.ShopSystem;
var UI = MANAGER_WindowsBase.Instance.UI;
if (!MANAGER_Shop.Instance.IsDataLoaded || string.IsNullOrEmpty(_currentCategory))
{
return;
}
List<ShopItem> availableItems = MANAGER_Shop.Instance.GetAvailableItems(_currentCategory);
// 1. Сначала выключаем всё, что не нужно
for (int i = 0; i < _itemPool.Count; i++)
{
if (i >= availableItems.Count)
{
_itemPool[i].gameObject.SetActive(false);
}
}
// 2. Включаем и настраиваем нужные
for (int i = 0; i < availableItems.Count; i++)
{
UI_ShopItem itemSlot;
if (i < _itemPool.Count)
{
itemSlot = _itemPool[i];
}
else
{
itemSlot = Instantiate(shopItemPrefab, itemsContainer);
_itemPool.Add(itemSlot);
}
// Важно: Setup должен идти ПЕРЕД активацией или сразу после,
// чтобы StopAllCoroutines в нем сработал до начала новых действий
itemSlot.Setup(availableItems[i]);
itemSlot.transform.localScale = Vector3.one;
itemSlot.gameObject.SetActive(true);
var btn = itemSlot.GetComponent<UnityEngine.UI.Button>();
if (btn != null) btn.interactable = true;
}
}
}