Coyote time и jump buffer: двенадцать строк хорошего прыжка
Когда игроки говорят «прыжок ощущается плохо», обычно они имеют в виду две недостающие функции. Обе пишутся за полчаса.
Как выглядит проблема
Каждый, кто тестирует ваш прототип платформера, говорит одно и то же: «прыжок какой-то странный». Никто не может сказать, что именно не так. Код верный: касаешься земли — прыгай, не касаешься — не прыгай.
Проблема не в коде, а в человеке. Игрок нажимает кнопку в тот момент, когда замечает, что сошёл с края, — но уже поздно. А нажав в воздухе, он ожидает прыжка в момент приземления.
Два маленьких окна допуска
Coyote time оставляет право на прыжок открытым ещё недолго после того, как персонаж покинул землю. Название пришло от мультяшного койота, который выбегает за обрыв и на мгновение зависает в воздухе.
Jump buffer работает в обратную сторону: если игрок нажал кнопку прямо перед приземлением, нажатие запоминается и срабатывает в момент касания земли.
Какими должны быть значения
В проектах, которые я измерял, оба окна хорошо работают в диапазоне 100–150 мс — то есть шесть-девять кадров при 60 FPS. Короче — эффект незаметен, длиннее — персонаж будто прыгает из воздуха.
Не зашивайте эти значения в код. Вынесите их в ScriptableObject или таблицу данных; дизайнер должен менять их, не запуская игру.
Как далеко это заходит
Та же логика окупается везде: буферизация ввода атаки, допуск двойного прыжка, окно захвата уступа, даже очередь клавиш в переходах меню.
Общее правило: когда намерение игрока конфликтует с правилами игры, решайте в пользу игрока. Игры, которые так делают, называют «отзывчивыми».