Время и камера: как мир реагирует на момент
Границы дока. Здесь — сценарная реакция: что делают ВРЕМЯ (замедление, пауза, 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 | скорость боя (выбор игрока) | ускорение боя |
| питч звука за slowmo | AudioParameters.TimeScale — звук проседает вместе с временем | да, автоматически |
| локальный hitstop | заморозка ПАРЫ «источник + цель», не всего кадра | да, по весу удара |
Камера — CameraModeController (он же IScreenShake), Cinemachine, 4 режима:
| Средство | Что делает | Задействовано |
|---|---|---|
Shake(intensity) | тряска с затуханием (trauma-модель) | добивание, тяжёлый удар, конец боя |
CombatFocusTarget | цель слежения камеры | да, общий фокус арены |
FrameArena() | кадрировать арену целиком | да |
режимы Action / Overview / Dev / Map | смена вида, клампы по зоне | да |
DiveMapTo / SurfaceMap / PlayMapIntro | наезд и всплытие на карте акта | да, вне боя |
Чего у камеры нет вообще: наезда на событие (punch-in), сдвига фокуса на конкретный юнит в момент, наклона кадра, кадрирования под финишер, экранных эффектов по событию (вигнетка, хроматическая аберрация, дисторсия).
Что реагирует сегодня
Вся политика живёт в CombatFeelDirector и сводится к четырём правилам:
- Добивающий удар — замедление, начатое ЗАРАНЕЕ (за
KillSlowLeadSecondsдо удара, через заглядывание в ленту боя) плюс тряска. Без лага показа «заранее» взять негде. - Тяжёлый удар (доля HP ≥
HeavyHitFrac) — тряска по силе. - Конец боя — тряска.
- Финишер — многоступенчатый таймлайн: пауза, замедление на смерть, замедление на разлёт осколков, возврат по кривой. Кандидат в финишеры — автор добивающего удара, если он мили.
Плюс локальный 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 (что в кооперативе общее).