Логи и отладка
Эта страница помогает понять, где искать причину, если перенос не сработал.
Начинайте не с названия внутренней фазы, а с того, что вы видите в игре:
- предмет не берётся
- предмет не кладётся
- предмет возвращается обратно
- данные после переноса не изменились
- swap работает неправильно
- в Console много предупреждений
Быстрая карта
| Что видно | С чего начать |
|---|---|
| Предмет не берётся | CanStartDrag, rules на исходном слоте, загрузка данных в UI |
| Предмет не кладётся | CanDrop, rules на целевом слоте, DropPolicySettings |
| Предмет кладётся в другой слот | FindAlternative, PlacementCandidateOrderer, drop на область инвентаря |
| UI изменился, данные нет | AddToData, RemoveFromData, правильный binding |
| Ошибка типа предмета | CreateItemConverter(), adapter-тип в source и target |
| Swap ломается после первого раза | конвертация в обе стороны и тип adapter-а в слотах после swap |
Какие логи что означают
| Лог или класс | Обычно означает |
|---|---|
RuleResult |
Сработало правило, которое запретило drag или drop. |
CanStartDrag |
Binding запретил начать перетаскивание. |
CanDrop |
Binding запретил drop в целевой inventory или slot. |
InventoryDropProcessor |
Drop был отклонён до фактического переноса. Часто причина в policy или target slot. |
InventoryTransferService |
Проблема возникла во время самого переноса: размещение, swap, конвертация или откат. |
GetAcceptableCount |
Система перебирает слоты и ищет, куда можно положить предмет. |
CanCommitTransfer |
Бизнес-логика запретила перенос прямо перед фиксацией. Например, не хватает золота. |
Если предупреждения идут по другим слотам
Это часто нормально. Система может проверять не только выбранный слот, если:
- предмет отпустили на область инвентаря
- включён
FindAlternative - нужно найти место для большого стека
- проверяется возможность swap
Если вы ожидали проверку только одного слота, проверьте:
- pointer действительно попадает в слот, а не в
InventoryDropArea - policy не разрешает
FindAlternative - выбранный slot не перекрыт другим UI-элементом
Если лог говорит про rule
Rule-лог не всегда означает баг. Иногда система просто проверяет несколько вариантов и один из них закономерно не подходит.
Смотрите не только сообщение, но и контекст:
- какой слот проверялся
- какой предмет проверялся
- это был выбранный слот или один из альтернативных
- после этого перенос всё-таки прошёл или нет
Если проблема в данных
Когда после переноса данные не совпадают с UI, смотрите binding:
GetItems()/GetOccupiedSlots()загружают правильные данные?AddToData(...)добавляет в правильный список?RemoveFromData(...)удаляет из правильного списка?- внешние изменения данных вызывают
ReloadUI()?
Если проблема между разными инвентарями
Например: торговец, игрок, экипировка или контейнер используют разные модели данных.
Проверьте:
- есть ли
CreateItemConverter()у нужного binding-а - какой adapter лежит в исходном слоте
- какой adapter должен лежать в целевом слоте
- сохраняет ли converter уникальные данные предмета
Если проблема в торговле или внешней проверке
Проверьте domain handler:
CanStartTransfer— можно ли вообще начинать переносCanStartTransferAsync— не отклонил ли перенос сервер или другая внешняя проверкаCanCommitTransfer— можно ли зафиксировать конкретное размещениеOnTransferSucceeded— не ломает ли побочный эффект данные после успешного переноса
Полезный порядок проверки
- Убедитесь, что предмет реально загружен в UI.
- Проверьте rules и
CanStartDrag. - Проверьте target slot,
CanDropи drop policy. - Если перенос между разными моделями, проверьте converter.
- Если есть деньги, сервер, права доступа или владение предметом, проверьте domain handler.
- Если UI и данные разъехались, проверьте add/remove методы binding-а.
См. также: