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

Логи и отладка

Эта страница помогает понять, где искать причину, если перенос не сработал.

Начинайте не с названия внутренней фазы, а с того, что вы видите в игре:

  • предмет не берётся
  • предмет не кладётся
  • предмет возвращается обратно
  • данные после переноса не изменились
  • 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 — не ломает ли побочный эффект данные после успешного переноса

Полезный порядок проверки

  1. Убедитесь, что предмет реально загружен в UI.
  2. Проверьте rules и CanStartDrag.
  3. Проверьте target slot, CanDrop и drop policy.
  4. Если перенос между разными моделями, проверьте converter.
  5. Если есть деньги, сервер, права доступа или владение предметом, проверьте domain handler.
  6. Если UI и данные разъехались, проверьте add/remove методы binding-а.

См. также: