fix(engine): findOne(x).onTouch + findOne �� ������ (�������-��������� �������������) #19

Merged
min merged 1 commits from fix/pointer-ontouch-findone into main 2026-05-31 06:53:47 +00:00

1 Commits

Author SHA1 Message Date
7c928462fc fix(engine): findOne(x).onTouch работает + findOne на старте скрипта
All checks were successful
CI / Lint (pull_request) Successful in 1m8s
CI / Build (pull_request) Successful in 1m56s
CI / Secret scan (pull_request) Successful in 2m31s
CI / PR size check (pull_request) Successful in 6s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
Баг: стрелка-указатель game.fx.pointer не переключалась на следующую цель —
при касании цель не менялась, стрелка не выключалась.

Первопричина (две движковые проблемы):
1. findOne(x).onTouch(...) не существовал: Instance-proxy не имел методов
   касания, движок ловил touch только объектов со скриптом-target/триггеров.
2. Race: скрипт исполняется синхронно в init, а sceneSnapshot приходил позже
   (rAF) → findOne() на старте = null → подписки onTouch молча не вешались.

Фикс:
- Instance-proxy: + onTouch/onUntouch/onClick → шлёт inst.watchTouch{ref}.
  Worker: _instTouchHandlers + маршрут instTouch/instUntouch/instClick по ref.
- GameRuntime: handler inst.watchTouch/watchClick → _watchedTouchRefs;
  routeInstEvent(ref,type); сброс в teardown.
- BabylonScene._detectTouchEvents: блок watched-объектов (AABB по ref, rising/
  falling edge → routeInstEvent), _refToTarget(ref)→{kind,id},
  _touchState.clear() в enterPlayMode.
- Первичный snapshot сцены передаётся прямо в init
  (ScriptSandbox.setInitialScene → worker заполняет _sceneIndex до userFn) →
  findOne работает в синхронном теле скрипта на старте.

Проверено: телепорт игрока по 3 целям игры 333 — стрелка переключается
red-cube→blue-sphere→gold-chest, на финале удаляется.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 08:28:02 +03:00