105 lines
3.3 KiB
C#
105 lines
3.3 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|