Время и камера: как мир реагирует на момент

Границы дока. Здесь — сценарная реакция: что делают ВРЕМЯ (замедление, пауза, hitstop) и КАМЕРА (тряска, зум, фокус, кадрирование) на боевое событие, и кто из событий этого достоин. Как событие выглядит — Gamefeel - VFX Language. Владелец реализации времени — контур combat-sim (TimeScaleService — единственный писатель Time.timeScale); джус его потребляет через Cinematic-API и не пишет в него напрямую.

Каркас и открытые вопросы — на 31.07.2026. Опись «что задействовано» — факт; шкала значимости и правила арбитрации ждут вердикта Макса.


Почему это один документ с политикой значимости

Визуальный эффект локален: искры на одном юните не мешают искрам на другом. Время и камера глобальны — их в кадре ровно по одной штуке, и два события не могут получить их одновременно. Поэтому «чем реагируем» и «кто этого достоин» — один и тот же вопрос, и разделять их значило бы получить два документа, которые спорят за одно решение.

Это же отличает нас от всех рефов. Классические приёмы — punch-in на финальный удар, kill cam, bullet time — придуманы для одного героя под управлением игрока. У нас автобой: несколько бойцов с каждой стороны бьют одновременно. Любое правило вида «на добивание делаем наезд» немедленно требует ответа на вопрос «а если добиваний два в один тик».

Кооператив состав НЕ раздувает: в гильдии всегда четыре «Сосуда», а игроков от одного до четырёх — меняется только то, кто кем управляет (Coop - Index §Модель сессии). Плотность арены — константа дизайна, и рассчитывать джус надо на неё, а не на худший случай с умножением на число игроков. Открытым остаётся другое: замедление глобально, а смотрят четыре игрока в разные места.


Арсенал: чем физически умеем реагировать

ВремяTimeScaleService (combat-sim), композит GameSpeed × Cinematic, пауза перекрывает всё:

СредствоЧто делаетЗадействовано
CinematicPulse(factor, hold, release, curve)импульс замедления с формой возвратаkill-slowmo
PlayCinematicSequence(segments[])таймлайн из сегментов — многоступенчатое замедлениефинишер
SetPausedжёсткая паузапауза игрока
SetGameSpeedскорость боя (выбор игрока)ускорение боя
питч звука за slowmoAudioParameters.TimeScale — звук проседает вместе с временемда, автоматически
локальный hitstopзаморозка ПАРЫ «источник + цель», не всего кадрада, по весу удара

КамераCameraModeController (он же IScreenShake), Cinemachine, 4 режима:

СредствоЧто делаетЗадействовано
Shake(intensity)тряска с затуханием (trauma-модель)добивание, тяжёлый удар, конец боя
CombatFocusTargetцель слежения камерыда, общий фокус арены
FrameArena()кадрировать арену целикомда
режимы Action / Overview / Dev / Mapсмена вида, клампы по зонеда
DiveMapTo / SurfaceMap / PlayMapIntroнаезд и всплытие на карте актада, вне боя

Чего у камеры нет вообще: наезда на событие (punch-in), сдвига фокуса на конкретный юнит в момент, наклона кадра, кадрирования под финишер, экранных эффектов по событию (вигнетка, хроматическая аберрация, дисторсия).


Что реагирует сегодня

Вся политика живёт в CombatFeelDirector и сводится к четырём правилам:

  1. Добивающий удар — замедление, начатое ЗАРАНЕЕ (за KillSlowLeadSeconds до удара, через заглядывание в ленту боя) плюс тряска. Без лага показа «заранее» взять негде.
  2. Тяжёлый удар (доля HP ≥ HeavyHitFrac) — тряска по силе.
  3. Конец боя — тряска.
  4. Финишер — многоступенчатый таймлайн: пауза, замедление на смерть, замедление на разлёт осколков, возврат по кривой. Кандидат в финишеры — автор добивающего удара, если он мили.

Плюс локальный hitstop на каждое прямое попадание, по весу удара — это уже презентер, не режиссёр.


Принципы из внешнего канона (справочно)

  • Тряска живёт 0.1–0.3 с. Дольше — читаемость рушится.
  • Массовое событие не умножает тряску. При десятке одновременных смертей нужен ровный гул, а не сумма импульсов. Наш случай ровно такой.
  • Замедление оправдано тем, что иначе не разглядеть. Его работа — дать восприятию догнать событие, а не украсить. Отсюда следствие: замедлять то, что и так читается, — потеря шкалы.
  • Hitstop — локальная заморозка нескольких объектов; freeze frame — весь кадр. Это разные инструменты, и второй у нас не задействован.
  • Наезд оправдан близкой встречей или последним ударом — тем, у чего есть композиция.

Открытые вопросы

#ВопросПочему нельзя решить по умолчанию
1Арбитрация: два добивания в один тик — кто получает камеру и замедление?глобальных средств по одной штуке; «оба» физически невозможно
2Шкала значимости: полный список «событие → чем реагируем», от автоатаки до конца боясегодня в шкале четыре пункта, и они выбраны по ходу, а не спроектированы
3Наезд камеры: заводим ли punch-in, и на что именнокамера общая для восьми юнитов; наезд на одного скрывает остальных
4Замедление при ускоренном бою: игрок поставил скорость ×3 — slowmo его уважает или перебивает?композит их перемножает, но что должно ЧУВСТВОВАТЬСЯ — вопрос дизайна
5Кооператив: чей момент замедляет время всем четверым?замедление глобально, а игроков четверо, и смотрят они в разные места. Состав при этом не меняется — четыре «Сосуда» всегда
6Экранные эффекты: вигнетка, дисторсия, freeze frame — что из этого нашени одного не задействовано, потолок качества высокий, цена читаемости тоже

Связано: Gamefeel - VFX Language (визуальный слой того же события), Gamefeel - Backlog (Tactile & Time) (банк идей), Vision - Visual Direction трек 5 (прежний дом тактильного слоя), Coop - Sync Model (что в кооперативе общее).