Skip to content

13 — Відлагодження

🇬🇧 English | 🇺🇦 Українська

Усе з цього розділу надає модуль InventorySystemDebug. Він працює одразу після ввімкнення плагіна й повністю вимикається у Shipping-збірках.


Інспектор

Накладна панель із живим станом інвентаря та спорядження локального гравця.

InvOverlay

Або з коду — щоб повісити на клавішу:

UISInventoryDebugLibrary::ToggleInventoryDebugOverlay(PlayerController);

Що він показує

Заголовок — актор-власник, режим мережі та чи має ця сторона владу. Режим виділено кольором: зелений — авторитетна сторона, жовтий — клієнт.

Це найкорисніше, що варто бачити одразу: більшість заплутаної поведінки мережевого інвентаря походить із того, що дивляться на клієнт і чекають авторитетних результатів.

Зведення — зайняті слоти й вага зі смужками, що змінюють колір із зеленої на жовту і червону в міру заповнення.

Вміст — по рядку на кожен зайнятий слот:

Елемент рядка Що означає
синій номер справжній індекс слота, разом із пропусками
назва та x5 / 20 скільки в стеку і скільки вміщується
сірий рядок фрагменти предмета: Stackable, Durability
фіолетова мітка UNIQUE предмет має власні значення — тому й не стакається
значення поруч самі значення: Durability 42

Спорядження — по рядку на кожен слот із AvailableSlots, включно з порожніми. Порожній слот — це теж інформація.

КнопкиSort, Compact, Clear.

На які питання він відповідає

Питання Де відповідь
«Чому ці два предмети не об'єднуються?» мітка UNIQUE і значення поруч
«Чому предмет потрапив у слот 7?» індекси слотів показані буквально
«Чому не вдягається?» список фрагментів (чи є Equippable) і перелік слотів персонажа
«Чи бачить клієнт те саме?» мітка режиму мережі в заголовку
«Чому не влазить?» смужки слотів і ваги

Особливості

  • Гра не ставиться на паузу — стан змінюється просто під час перегляду.
  • Оновлюється сам — за подіями плюс повільний таймер.
  • Не потребує жодного ассету — дерево віджетів будується в C++.
  • Ніколи не відкриється у Shipping, хто б його не викликав.

Найкорисніший спосіб застосування: відкрийте інспектор на сервері й на клієнті водночас (Play As Client, 2 гравці) і порівняйте. Розбіжність між ними — майже завжди корінь проблеми.


Консольні команди

Доступні автоматично на будь-якому CheatManager. Працюють і на клієнті: команди, що змінюють стан, пересилаються на сервер, а команди, що показують стан, виконуються там і надсилають звіт назад.

Інвентар

Команда Дія
InvOverlay відкрити / закрити інспектор
InvItems [частина назви] перелічити типи предметів у проєкті
InvGive <частина назви> [скільки] видати собі предмет
InvRemove <частина назви> [скільки] забрати в себе предмет
InvClear очистити інвентар
InvFill [скільки] заповнити випадковими предметами
InvList показати вміст
InvUse <слот> використати предмет
InvSort впорядкувати за назвою
InvCompact об'єднати неповні стеки
InvWeight показати вагу відносно ліміту

Спорядження

Команда Дія
EquipList показати вдягнуте, включно з порожніми слотами
EquipSlot <слот інвентаря> вдягнути предмет із цього слота
EquipRemove <тег слота> зняти зі слота
EquipClearAll зняти все

Пошук предметів — за частиною назви, без урахування регістру: InvGive sword знайде DA_IronSword. Точний збіг назви ассета має пріоритет, тож однозначний запит не перехопить довша назва.

Почніть із InvItems — вона покаже, які предмети взагалі є в проєкті, і як їх називати в інших командах.


Детальний лог

Log LogInventorySystem Verbose

Друкує кожне додавання, вилучення й переміщення з індексами слотів і розмірами стеків. Зазвичай цього достатньо, щоб побачити, чому предмет пішов не туди.

Увімкнути назавжди: Project Settings → Game → Inventory System → Verbose Logging.

Що варто шукати в логу:

Рядок Означає
Add refused ('X'): ... предмет відхилено, і чому саме
AddItem 'X' x5 -> remainder 2 влізло не все
Added [Slot 3] X x5 що і куди насправді лягло
requires authority ви викликали серверний метод на клієнті

Перевірка предметів

У dev-збірках плагін перевіряє всі ISItemDefinition на старті світу й пише проблеми в лог: порожні назви, дубльовані фрагменти, Equippable без слота, суперечливі межі таблиць луту.

Вимикається: Project Settings → Game → Inventory System → Validate Items On Startup.

Ті самі перевірки працюють і в редакторі під час збереження ассета — проблеми видно прямо на ньому.


Автоматичні тести

Tools → Session Frontend → Automation, фільтр InventorySystem.

Або з командного рядка:

UnrealEditor-Cmd Проєкт.uproject \
  -ExecCmds="Automation RunTests InventorySystem.; Quit" \
  -unattended -nullrhi

Групи: InventorySystem.Inventory, .Equipment, .Loot, .Persistence, .ItemDefinition, .ItemInstance, .DebugOverlay.


Чеклист «чому не працює»

Проходьте згори вниз — питання впорядковані за частотою.

Предмет не додається. 1. InvList — інвентар узагалі знайдено? Якщо «you have no inventory» — компонента немає на акторі. 2. Підпишіться на OnAddRejected — вона несе готову причину. 3. InvWeight — не впирається у вагу? 4. Перевірте AllowedItemTags / BlockedItemTags на компоненті.

Предмети не об'єднуються в стек. 1. Відкрийте інспектор: чи є мітка UNIQUE? Значить, у предмета є власні значення — це і є причина. 2. Чи є фрагмент Stackable? Без нього максимум стеку — 1.

Предмет не вдягається. 1. Інспектор: чи є в переліку фрагментів Equippable? 2. EquipList: чи є в персонажа потрібний слот у AvailableSlots? 3. Слот у фрагменті й слот у компоненті — це має бути той самий тег.

Працює в редакторі, не працює на клієнті. 1. Ви покладаєтеся на повернене значення Try*? На клієнті воно означає «надіслано». 2. Ви звертаєтеся до скрині напряму? Треба через інвентар гравця — 09 — Мультиплеєр. 3. Відкрийте інспектор на обох боках і порівняйте.

UI не оновлюється. 1. Підписані на події, чи опитуєте щокадру? 2. Підписка сталася після того, як компонент з'явився? На клієнті він може прийти пізніше за віджет.

Теги не знаходяться. 1. Перевірте написання — теги чутливі до регістру. 2. Свої теги додавайте у власний Config/Tags/*.ini проєкту, а не в файл плагіна: оновлення плагіна перезапише його.


Куди далі