7.1 KiB
7.1 KiB
Система инвентаря Sasalka
Обзор
Новая система инвентаря была полностью переработана для улучшения производительности, сетевой синхронизации и пользовательского опыта.
Основные изменения
1. Inventar (Основной класс инвентаря)
- Теперь наследуется от
Componentдля лучшей интеграции с S&box - Добавлена сетевая синхронизация с атрибутами
[Sync] - Улучшена валидация при добавлении предметов
- Добавлена поддержка стакания предметов
- Новые события:
OnItemAdded,OnItemRemoved
2. InventoryItem
- Добавлена сетевая синхронизация с
[Sync] - Улучшена валидация количества предметов
- Новые методы:
CanStackWith,CanAddCount,TryAddCount,TryRemoveCount,Clone
3. Определения предметов
BaseItemDefinition
- Добавлены категории предметов (
ItemCategory) - Добавлена система редкости (
ItemRarity) - Добавлен вес предметов
- Улучшен редактор с группировкой свойств
WeaponItemDefinition
- Добавлены свойства оружия (урон, скорострельность, дальность)
- Улучшена структура
WeaponDefinition
ClothingItemDefinition
- Добавлены свойства брони и видимости
- Улучшена интеграция с системой одежды
AmmoItemDefinition (новый)
- Специализированное определение для патронов
- Система совместимости с оружием
- Свойства патронов (урон, пробивная способность)
4. UI инвентаря
- Добавлена фильтрация по категориям
- Улучшен дизайн с поддержкой редкости
- Отображение экипированных предметов
- Адаптивный интерфейс
Исправления API
Сетевая синхронизация
- Заменены атрибуты
[Net]на[Sync]для совместимости с S&box - Все изменения инвентаря автоматически синхронизируются между клиентами
Методы коллекций
- Исправлен метод
ContainsValue()наValues.Contains()дляDictionary - Обновлены методы работы с коллекциями для совместимости
Using директивы
- Добавлены необходимые
usingдирективы в UI файлы - Исправлены namespace для компонентов
Наследование
- Исправлено наследование
PickupItemотSandbox.UI.InteractionButton - Обновлены интерфейсы и базовые классы
Использование
Создание предметов
// Создание предмета оружия
var weaponItem = new InventoryItem
{
Definition = ResourceLibrary.Get<WeaponItemDefinition>("Items/pistol_test.weapon")
};
inventory.AddItem(weaponItem);
// Создание патронов
var ammoItem = new InventoryItem
{
Definition = ResourceLibrary.Get<AmmoItemDefinition>("Items/pistol_ammo.ammo")
};
ammoItem.Count = 30;
inventory.AddItem(ammoItem);
Экипировка предметов
// Экипировка предмета
inventory.EquipItem(item);
// Проверка экипированного предмета
var equippedWeapon = inventory.GetEquippedItem(Inventar.InventorySlot.RightHand);
Валидация
// Проверка возможности добавления
if (inventory.CanAddItem(item))
{
inventory.AddItem(item);
}
// Проверка стакания
if (item1.CanStackWith(item2))
{
// Предметы можно объединить
}
Создание определений предметов
Оружие
- Создайте ресурс типа "Weapon Item Definition"
- Укажите слот экипировки
- Настройте параметры оружия (урон, дальность и т.д.)
- Укажите тип патронов
Патроны
- Создайте ресурс типа "Ammo Item Definition"
- Укажите тип патронов
- Настройте совместимость с оружием
Одежда
- Создайте ресурс типа "Clothing Item Definition"
- Укажите слот экипировки
- Добавьте URL одежды из Workshop
Сетевая синхронизация
Все изменения инвентаря автоматически синхронизируются между клиентами благодаря атрибутам [Sync] на свойствах Items и EquippedItems.
Производительность
- Улучшена производительность UI с оптимизированным
BuildHash() - Добавлено кэширование для
GetUsables() - Оптимизирована работа с коллекциями
Миграция
Для миграции существующих предметов:
- Обновите определения предметов с новыми свойствами
- Измените код создания предметов на новый API
- Обновите UI для использования новых компонентов
Тестирование
InventoryTest
Используйте компонент InventoryTest для добавления тестовых предметов:
// Добавьте компонент к игроку и установите AddTestItems = true
var testComponent = player.GameObject.Components.GetOrCreate<InventoryTest>();
testComponent.AddTestItems = true;
InventoryCompilationTest
Используйте компонент InventoryCompilationTest для проверки компиляции:
// Добавьте компонент к игроку и установите RunTest = true
var testComponent = player.GameObject.Components.GetOrCreate<InventoryCompilationTest>();
testComponent.RunTest = true;
Известные проблемы
- Убедитесь, что все необходимые ресурсы (префабы, текстуры) существуют
- Проверьте, что определения предметов правильно настроены в редакторе
- При использовании в сети убедитесь, что все компоненты имеют правильные атрибуты
[Sync]