PJ/Assets/scripts/dotfs_scripts/UI_ShopWindow.cs

105 lines
No EOL
3.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}