Camera Shake или как передать ощущения игры
Доброго времени суток. Представлюсь, для тех, кто меня еще не знает. Меня зовут Дима. Я работаю C++ разработчиком уже более 5 лет. На данный момент работаю в крупной Gamedev-студии. Помимо работы увлекаюсь созданием образовательного контента для YouTube и Twitch каналов.
Эта статья является продолжением статьи Unity3D – Camera Shake. Как сделать подвижную камеру, чтобы улучшить отдачу от вашей игры.
Я принял во внимание сделанное замечание по поводу того, что лучше использовать тряску через вибрацию, а затем обнаружил, что первый вариант моего решения всё равно не является безопасным с точки зрения частых вызовов функций вибрации и "ударного вращения". Под частым я подразумеваю запуск тряски в то время, когда предыдущая тряска еще не закончилась. И на реальных проектах такое допущение будет неприемлимым.
Начнём с ударного вращения. Под этим понятием я подразумеваю направленную тряску камеры. Представим это так: Ваш персонаж получил урон(удар) и его голова от пришедшего удара мотнулась в сторону, а затем вернулась на место. Проблемой предыдущего моего решения было то, что логика бы перестала работать, если бы следующее ударное вращение было бы запущено до того как закончилось текущее - камеры бы просто не смогла корректно вернуться на место. Для того, чтобы это обойти я решил логику по вращению персонажа переместить в функцию Update, которая вызывается каждый кадр. Теперь скрипт каждый кадр будет либо пытаться вернуть камеру на место, либо двигать её в сторону направления вращения.
Перейдём к реализации:
Протестировав данный код(см. видео) убедимся, что решение хорошо переживает многократные вызовы и теперь сделаем тряску камеры, многократно вызывая ударное вращение на определённом промежутке времени.
Однако нужно внести небольшие изменения: необходимо запретить вызов ударного вращения извне, если в данный момент выполняется тряска камеры.
Перенесём логику вращения в приватный метода, а логику публичного ограничим флагом:
Тряска камеры
Дабы не перегружать логику функции Update, сделаем тряску камеры через корутину:
Примеры
Приведу пару примеров хорошо подобранных параметров, дабы можно было данное решение красиво продемонстрировать в деле:
Недостатки
Главным недостатком я считаю то, что вращение будет работать корректно только в диапазоне углов (0..90) ибо tg (90°) = tg (π/2) = +∞.
Код
Приведу полный код скрипта:
Ссылки
Для полного ознакомления с кодом и наглядной демонстрацией рекомендую ознакомиться с видео на Youtube-канале:
Мы на других ресурсах:
Мне вот интересно, кто вам "разаработчикам" сказал, что тряска камеры передает ощущение для игрока? Меня всегда бесила и будет бесить тряска камеры, так же как и размытие. Кроме как морального раздражения эти вещи не могут передать при игре.
Не пойму, к чему тут эти кавычки. А сказали мне об этом тенденции развития индустрии. Любой инструмент, если его использовать чересчур активно, будет раздражать. Я же не говорю о вибрации постоянной, либо с большим разбросом углов, что сделает картинку дёрганной. Как вы будете передавать игроку отдачу оружия или ощущение падения? В видео я привожу в пример геймплей CS 1.6, где данные механизмы используются в меру и к месту. Вы считаете игра была бы лучше без них?
Комментарий недоступен
Комментарий недоступен
Quaternion*Вьетнамские флешбеки
Хорошее видео про тряску камеры с GDC.
Какая причина может быть в вылетах игры? Только не подумай, что я прошу про какую-то конкретную игру. Я пишу рассказ ,в котором инди-разработчик "допиливает" свою игру, исправляя баги. Рассказ не о играх, не о разработке игр, так что мне не нужны подробности. Меня вполне удовлетворил бы ответ по типу: "Игра влетает потому что буфер обмена переполнен спрайтами взрыва". То есть максимально простой ответ в принципе о любой игре.
Если любишь конкретику, то по каким причинам вылетали на рабочий стол твои игры? Опиши простым языком?