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 проєкту, а не в файл плагіна:
оновлення плагіна перезапише його.
Куди далі¶
- Розібратися з мережею: 09 — Мультиплеєр
- Короткі відповіді на часті питання: 14 — Поширені запитання