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