Bullet Time
Сповільнення світу, поки гравець рухається на повній швидкості, — два годинники, а не один.
Приклади
Записано з інтерактивного демо нижче на цій сторінці.
Огляд
Bullet time сповільнює все, крім гравця: вороги, снаряди і VFX повзуть, а гравець ухиляється і цілиться в нормальному темпі — фірмовий прийом Max Payne і момент, коли слоу-мо перестає бути глобальним перемикачем і стає системною задачею.
Глобальний Time.timeScale цього не вміє: він сповільнює всіх порівну. Справжня техніка дає об'єктам локальні годинники — кожен споживач множить дельту часу на свій коефіцієнт, — тож «світ» біжить на 0.2, а «гравець» на 1.0. Фізика, швидкості анімацій, частки і пітч звуку мають поважати правильний годинник — саме тому це Advanced.
Виграш — фантазія про силу, якої не дасть глобальне слоу-мо: гравець не дивиться на повільний світ, він швидкий у ньому. Контраст двох швидкостей — видимий у кожній парі об'єктів, що перетинаються, — і є весь ефект.
Інтерактивне демо
Де застосовується
Найкращі практики
Варто
- ✓Проводьте кожного споживача часу через посилання на годинник (світовий чи гравцевий), а не через пряме читання Time.deltaTime.
- ✓Ізьте вхід і вихід зі сповільнення за ~100–200 мс — миттєвий стрибок 1.0→0.2 читається як фриз, а не здібність.
- ✓Опускайте пітч звуків світу, поки він сповільнений, — вухо помічає розсинхронений звук швидше, ніж око — рух.
Не варто
- ✕Не реалізуйте через глобальний timeScale плюс «прискорити гравця на компенсацію» — анімації, фізика й затримка інпуту розлазяться.
- ✕Не пускайте UI, згладжування камери чи опитування інпуту на світовому годиннику — інтерфейс мусить жити в реальному часі.
- ✕Не лишайте фізику світу на дефолтному fixed timestep, якщо світовий годинник рухає Rigidbody, — заїкання з'явиться саме тоді, коли всі дивляться.
Поширені помилки
- ⚠Пропущена одна система (сплеск часток, твін, звук кроку), що досі живе на глобальному годиннику і миттєво ламає ілюзію.
- ⚠Різке відновлення масштабу світу, коли здібність закінчується посеред ухилення, — кожен сповільнений снаряд телепортується в повну швидкість.
- ⚠Таймери кулдаунів і здібностей на світовому годиннику — bullet time продовжує сам себе.
Реалізація
Встав це у свого ШІ-асистента (Cursor, Copilot, Claude), щоб додати ефект у проєкт.
Додай у мій проєкт ефект "Bullet Time": Сповільнення світу, поки гравець рухається на повній швидкості, — два годинники, а не один.
Як це працює: Bullet time сповільнює все, крім гравця: вороги, снаряди і VFX повзуть, а гравець ухиляється і цілиться в нормальному темпі — фірмовий прийом Max Payne і момент, коли слоу-мо перестає бути глобальним перемикачем і стає системною задачею.
Рекомендації:
- Проводьте кожного споживача часу через посилання на годинник (світовий чи гравцевий), а не через пряме читання Time.deltaTime.
- Ізьте вхід і вихід зі сповільнення за ~100–200 мс — миттєвий стрибок 1.0→0.2 читається як фриз, а не здібність.
- Опускайте пітч звуків світу, поки він сповільнений, — вухо помічає розсинхронений звук швидше, ніж око — рух.
Чого уникати:
- Не реалізуйте через глобальний timeScale плюс «прискорити гравця на компенсацію» — анімації, фізика й затримка інпуту розлазяться.
- Не пускайте UI, згладжування камери чи опитування інпуту на світовому годиннику — інтерфейс мусить жити в реальному часі.
- Не лишайте фізику світу на дефолтному fixed timestep, якщо світовий годинник рухає Rigidbody, — заїкання з'явиться саме тоді, коли всі дивляться.
Реалізуй ефект у тому рушії/стеку, який уже використовується в проєкті, і дотримуйся наявного стилю коду. Підключи його там, де це доречно.Джерела
- Max Payne's bullet time — the trope codifier
- Game Feel — Steve Swink (book)
Коментарі
…