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 _itemPool = new List(); private string _currentCategory; // Опционально: если MANAGER_GameEvents имеет событие OnUIUpdate, // подпишись на него, чтобы витрина перестраивалась автоматически после покупки. protected override void Awake() { base.Awake(); MANAGER_GameEvents.OnUIUpdateNeeded += RefreshStore; } private void OnDestroy() { MANAGER_GameEvents.OnUIUpdateNeeded -= RefreshStore; } /// /// Этот метод вызывается из твоего MANAGER_UI /// public void OpenCategory(string category) { _currentCategory = category; base.OpenWindow(); RefreshStore(); } /// /// Отрисовка и обновление магазина с использованием пула объектов /// 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 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(); if (btn != null) btn.interactable = true; } } }