Что это: Этот модуль предоставляет систему для создания и управления коллекционными предметами. Он позволяет отслеживать собранные предметы, отображать их в UI, а также включает механику открытия "коробок" ...
Оглавление: см. список ссылок ниже.
Этот модуль предоставляет систему для создания и управления коллекционными предметами. Он позволяет отслеживать собранные предметы, отображать их в UI, а также включает механику открытия "коробок" или "контейнеров" с предметами.
- ✅ Singleton-паттерн: Использует
Singleton<T>для глобального доступа черезCollection.IиCollectionVisualManager.I - ✅ Полный API для работы через код: Добавление, удаление, проверка предметов программно
- ✅ Автоматическая синхронизация:
CollectionVisualManagerавтоматически обновляется при изменении коллекции - ✅ Безопасная инициализация: Предотвращает баги с отображением при неправильном порядке инициализации
- ✅ События: Подписка на изменения коллекции через UnityEvents; при изменении состава вызываются
OnCompletionChanged(unlocked, total) иOnCompletionPercentageChanged(0–1) - ✅ Сохранение прогресса: Автоматическое сохранение через SaveProvider (единое хранилище с остальной системой сохранений)
- ✅ Несколько коллекций: На дополнительных GameObject с
Collectionвыставите Set Instance On Awake = false — экземпляр не будет регистрироваться какCollection.I. Работайте с ним по ссылке (поле Collection в ItemCollectionInfo, ItemCollection). СвойствоIsSingletonпоказывает, является ли экземпляр глобальным.
- Collection: Главный класс-синглтон, управляющий логикой всей коллекции. Предоставляет полный API для работы через код.
- CollectionVisualManager: Синглтон, управляющий визуальным отображением всех предметов коллекции. Автоматически синхронизируется с
Collection. - ItemCollection: Визуальное представление одного коллекционного предмета в UI.
- Box: Реализует логику для "коробки" или "контейнера", который можно открыть.
- ItemCollectionData:
ScriptableObjectдля хранения данных о коллекционных предметах. - ItemCollectionInfo: Компонент для отображения детальной информации о предмете (название, описание, изображение).
- Создайте данные предметов: Создайте
ItemCollectionDataчерез менюCreate > Neoxider > Bonus > Collection > Item Collection Data - Настройте Collection: Добавьте компонент
Collectionна GameObject в сцене и заполните массивItemCollectionDatas - Настройте UI: Создайте UI элементы с компонентом
ItemCollectionи добавьтеCollectionVisualManagerдля управления ими - Используйте через код:
// Добавление предмета
Collection.I.AddItem(0);
// Проверка наличия
if (Collection.I.HasItem(0)) { ... }
// Получение статистики
Debug.Log($"Разблокировано: {Collection.I.UnlockedCount}/{Collection.I.ItemCount}");
Debug.Log(Collection.I.GetCompletionCountText()); // "1/5"
Debug.Log(Collection.I.GetCompletionPercentage()); // 0–1
// Подписка на изменение прогресса (без кода)
// Collection.I.OnCompletionChanged (int unlocked, int total)
// Collection.I.OnCompletionPercentageChanged (float 0–1)// Проверка и добавление предметов
if (!Collection.I.HasItem(5))
{
Collection.I.AddItem(5);
Debug.Log("Предмет 5 добавлен!");
}
// Подписка на события
Collection.I.OnItemAdded.AddListener((id) => {
Debug.Log($"Новый предмет {id} добавлен в коллекцию!");
CollectionVisualManager.I.RefreshItem(id);
});
// Разблокировка всех предметов (для тестирования)
Collection.I.UnlockAllItems();
// Добавление по данным или по индексу
Collection.I.AddItem(itemCollectionData);
bool added = Collection.I.TryAddItem(3);
// Разблокировка из UI: на кнопке карточки вызовите ItemCollection.Unlock() через UnityEvent// Обновление всех элементов
CollectionVisualManager.I.RefreshAllItems();
// Обновление конкретного элемента
CollectionVisualManager.I.RefreshItem(2);
// Получение элемента
var item = CollectionVisualManager.I.GetItem(0);
if (item != null && item.IsEnabled)
{
Debug.Log("Предмет 0 разблокирован и отображается");
}
// Фильтрация
int[] unlocked = Collection.I.GetUnlockedIds();
int[] locked = Collection.I.GetLockedIds();
int[] byCategory = Collection.I.GetIdsByCategory(1);
int[] byRarity = Collection.I.GetIdsByRarity(ItemRarity.Epic);
int countByRarity = Collection.I.GetUnlockedCountByRarity(ItemRarity.Legendary);