99 lines
4.2 KiB
C#
99 lines
4.2 KiB
C#
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
public class ShopManager : MonoBehaviour
|
||
{
|
||
[Header("Связи")]
|
||
[Tooltip("Ссылка на скрипт управления строительством")]
|
||
public FurnitureController builder;
|
||
|
||
[Tooltip("Префаб UI-кнопки магазина")]
|
||
public GameObject buttonTemplate;
|
||
|
||
[Tooltip("Объект Content, внутри которого лежит Grid Layout Group")]
|
||
public Transform contentPanel;
|
||
|
||
[Header("Каталог мебели")]
|
||
[Tooltip("Список всех карточек товаров (Scriptable Objects)")]
|
||
public List<FurnitureItemSO> items;
|
||
|
||
private void Start()
|
||
{
|
||
GenerateShop();
|
||
}
|
||
|
||
public void GenerateShop()
|
||
{
|
||
// 1. Очищаем панель от старых кнопок (полезно при переключении категорий)
|
||
foreach (Transform child in contentPanel)
|
||
{
|
||
Destroy(child.gameObject);
|
||
}
|
||
|
||
// 2. Проходимся по каждой карточке в нашем каталоге
|
||
foreach (FurnitureItemSO item in items)
|
||
{
|
||
if (item == null) continue; // Защита от пустых слотов в инспекторе
|
||
|
||
// Создаем новую кнопку внутри contentPanel
|
||
GameObject newButton = Instantiate(buttonTemplate, contentPanel);
|
||
|
||
// Находим компонент Image на этой кнопке и применяем иконку из SO
|
||
Image btnImage = newButton.GetComponent<Image>();
|
||
if (btnImage != null && item.catalogIcon != null)
|
||
{
|
||
btnImage.sprite = item.catalogIcon;
|
||
}
|
||
|
||
// Настраиваем действие при нажатии на кнопку
|
||
Button btn = newButton.GetComponent<Button>();
|
||
if (btn != null)
|
||
{
|
||
// Важно: создаем локальную переменную для передачи в событие (замыкание)
|
||
FurnitureItemSO itemToSelect = item;
|
||
|
||
// При клике передаем нашу карточку товара прямо в контроллер строительства
|
||
btn.onClick.AddListener(() =>
|
||
{
|
||
builder.SelectFurnitureAndCloseShop(itemToSelect);
|
||
});
|
||
}
|
||
}
|
||
}
|
||
// ==========================================
|
||
// МАГИЯ ДЛЯ АВТО-ЗАПОЛНЕНИЯ СПИСКА
|
||
// ==========================================
|
||
|
||
// Этот атрибут создает кнопку в контекстном меню скрипта
|
||
[ContextMenu("Найти всю мебель в проекте")]
|
||
private void FindAllFurnitureInProject()
|
||
{
|
||
// Этот код выполняется ТОЛЬКО в редакторе Unity, в саму игру на телефон он не попадет
|
||
#if UNITY_EDITOR
|
||
// 1. Очищаем старый список
|
||
items.Clear();
|
||
|
||
// 2. Ищем ВСЕ файлы типа FurnitureItemSO во всех папках проекта
|
||
string[] guids = UnityEditor.AssetDatabase.FindAssets("t:FurnitureItemSO");
|
||
|
||
foreach (string guid in guids)
|
||
{
|
||
// Узнаем путь к файлу
|
||
string path = UnityEditor.AssetDatabase.GUIDToAssetPath(guid);
|
||
|
||
// Загружаем файл и добавляем в список
|
||
FurnitureItemSO item = UnityEditor.AssetDatabase.LoadAssetAtPath<FurnitureItemSO>(path);
|
||
if (item != null)
|
||
{
|
||
items.Add(item);
|
||
}
|
||
}
|
||
|
||
// 3. Говорим Unity сохранить изменения в скрипте (чтобы список не сбросился)
|
||
UnityEditor.EditorUtility.SetDirty(this);
|
||
|
||
Debug.Log($"<color=green>Автоматически найдено и добавлено предметов: {items.Count}</color>");
|
||
#endif
|
||
}
|
||
} |