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