SummerGame/Assets/_Project/Scripts/MetaPart/ShopManager.cs

99 lines
4.2 KiB
C#
Raw 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;
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
}
}