Перейти к содержанию

Экипировка оружия и предметов

Категория изменения: feature. Система отвечает за установку префабов и выбор визуального скина. Боевые характеристики, владение предметами, способности, UI инвентаря и сохранение сборки подключаются отдельно.

Структура

  • GunCollection.Guns: сериализуемый Unity словарь Guns → GunView.
  • ItemCollection.Items: сериализуемый Unity словарь Items → ItemView.
  • Каждая модель имеет отдельный префаб. Все её скины находятся внутри него и назначаются в массив Skins.
  • GunSkin и ItemSkin должны находиться на отдельных дочерних ветках префаба. Нельзя назначать корень префаба, один объект дважды или вложенные друг в друга корни скинов.
  • PlayerView.GunSlots и EquipSlots содержат явные ссылки на точки крепления.
  • PlayerEquipmentSystem хранит созданные экземпляры, создаёт их дочерними объектами точек крепления и удаляет только собственные экземпляры.

EquipSlots: индекс 0 — двигатель, 1 — ПВО, 2 — РЭБ. Поле ItemView.Slot определяет допустимый слот. Число оружейных слотов задаётся массивом GunSlots.

Все префабы и коллекции примера созданы через подключённый Unity Pipeline. Префаб Assets/Prefabs/Equipment/PlayerEquipmentExample.prefab уже содержит PlayerView, систему, ссылки на коллекции, три слота оружия и три слота предметов. На старте устанавливается одна «Основа», остальные слоты пустые. Существующий игровой танк и сцены не изменены.

Коллекции находятся в Assets/Data/Equipment. Полный набор затычек включает 41 пушку из weapons-and-enemies.md, progression.md и locations.md, а также 60 предметов из items.md. Префабы оружия находятся в Assets/Prefabs/Equipment/Guns, оборудования — в Assets/Prefabs/Equipment/Items. Каждая модель имеет собственный префаб и два простых скина. Пока реализованы только визуальные затычки, без характеристик и способностей.

Имена enum используют коды каталога: Guns.K_W1 вместо собственного имени. В Inspector благодаря InspectorName отображается K-W1; дефис недопустим в идентификаторе C#. Коды префабов совпадают с отображением в Inspector. У оборудования в исходном документе нет кодов: введены ENG-I1…20 для двигателей, AD-I1…20 для ПВО и EW-I1…20 для РЭБ; номер соответствует строке каталога внутри категории. Полная таблица находится в equipment-catalog.md.

Числовые ID уже созданных моделей сохранены: K_W1 = 1, K_W2 = 2, C_W1 = 3, ENG_I1 = 1. Ссылки прежних четырёх префабов сохранены переносом через AssetDatabase. Для добавления моделей расширяйте соответствующий enum явным постоянным ID и назначайте префаб в словаре; существующие ID не перенумеровывайте.

Использование

equipment.TryEquipGun(0, Guns.K_W1);         // Скин 0.
equipment.TryEquipGun(0, Guns.K_W1, 1);      // Смена скина без пересоздания.
equipment.TryEquipGun(0, Guns.K_W2);         // Замена префаба в слоте.
equipment.TryEquipItem(0, Items.ENG_I1);     // Двигатель.
equipment.TryEquipItem(1, Items.AD_I1);      // ПВО.
equipment.TryEquipItem(2, Items.EW_I1);      // РЭБ.
equipment.UnequipGun(0);
equipment.UnequipItem(0);
equipment.GetGun(0)?.Shoot();                   // Только визуальная реакция скина.

Методы экипировки возвращают false, если отсутствует точка крепления, ID, префаб или допустимый скин, либо предмет не подходит слоту. Текущая экипировка при этом сохраняется. None снимает экипировку. Старый экземпляр сразу отключается и уничтожается в конце кадра. GetGun, GetItem, GetGunId и GetItemId дают доступ к текущей сборке.

Компонент и все точки крепления должны быть заранее настроены в префабе игрока; массивы слотов не следует менять во время работы системы. Компонент системы имеет тот же срок жизни, что и его PlayerView. Начальные массивы startingGuns и startingItems сопоставляются слотам по индексу; пустые записи используют None.

Проверка вручную — не выполнена

  1. Поставить PlayerEquipmentExample в тестовую сцену и запустить Play Mode: одна «Основа» в первом оружейном слоте, остальные слоты пустые.
  2. Поменять оружие в слоте: новый экземпляр принадлежит нужному слоту, старый отключён и удаляется; прочие слоты сохраняются.
  3. Выбрать второй скин той же модели: экземпляр префаба сохраняется, активен только выбранный скин.
  4. Установить ENG_I1 в слот 0, AD_I1 в слот 1 и EW_I1 в слот 2; попытка установить предмет в чужой тип слота возвращает false и сохраняет его содержимое.
  5. Проверить неправильный индекс, отсутствующий ID и скин: метод возвращает false, текущее оружие/предмет остаётся.
  6. Снять экипировку и повторить снятие: ошибок нет, вручную созданные дочерние объекты точки крепления сохраняются.
  7. Перезагрузить Editor и проверить сохранение словарей и ссылок коллекций, затем повторить старт.
  8. Проверить отображение кодов enum с дефисом в Inspector и выбрать затычки каждой группы оружия и оборудования; у каждой модели переключаются оба скина.

Изменений существующих основных систем боя, инвентаря, сохранений и переходов нет. Компиляция проверяется через Unity Pipeline; проверки поведения выполняет пользователь вручную.