Два бага меню в плеере:
1. Повторный ESC открывал меню ПОВЕРХ первого (не закрывал).
2. После открытия/закрытия меню переставала работать orbit-камера по
зажатой ПКМ (игры задачи 2 camera_mouse_controls).
Первопричина: ESC слушали ДВА обработчика — движок (setOnExitRequest →
_onEscMenu) и React (отдельный keydown при topMenuOpen). На одно нажатие
срабатывали оба → гонка: меню дублировалось, а _uiCursorMode застревал в
true, из-за чего onCanvasMouseDownGlobal (if _uiCursorMode return) игнорировал
ПКМ → orbit-камера не включалась.
Фикс — единый источник истины в движке:
- BabylonScene: флаг _playerMenuOpen + toggle в setOnExitRequest (открыто→
закрыть+setUiCursorMode(false), закрыто→открыть). _onEscMenu(open) передаёт
состояние в UI. setPlayerMenuOpen(open) — синхронизация при закрытии из UI
(кнопка «Продолжить»). Сброс флага в enterPlayMode.
- KubikonPlayer: setOnEscMenu((open)=>setTopMenuOpen(open)); УБРАН дублирующий
React ESC-обработчик; onClose меню → setPlayerMenuOpen(false); синхронизация
_playerMenuOpen=true в onLockChange (perma) и setOnPlayChange.
- PlayerController.setUiCursorMode(true): сброс _rmbHeld=false (иначе если меню
открыли при зажатой ПКМ, флаг застревал → orbit «думал» что ПКМ активна).
Проверено: ESC открыл→ESC закрыл (1 меню в DOM), ПКМ-orbit работает после меню.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>