FPS камера в SRP
На официальном YouTube канале Unity вышло видео демонстрирующее гибкость SRP на примере FPS камеры, которая не обрезает пересекающуюся геометрию игрока и сцены.
Ремарка: хоть ребята из юнити назвали это "создание фпс камеры которая не ...", в видео не рассказывают о создании таких вещей как передвижение игрока, обзор и т.д.
Речь в статье и видео идёт только о решении проблемы пересекающихся геометрий, которая приводит к "проваливанию" конечностей игрока сквозь стены.
Пример демонстрирует отказ от дополнительной камеры, которая занимается отрисовкой только FPS оружия (рук игрока) и достижение того же результата путём настройки рендерера.
Может показаться, что речь идёт о чём-то страшном, но это не так. В примере используется LWRP.
Всего 3 простых шага:
- Создать кастомный forward renderer
- В Pipeline asset присвоить созданный в предыдущем шаге рендерер
- В кастомном рендерере убрать слой оружия из Default Layer Mask и переопределить этот слой как Render Object в Renderer Features
Таким образом мы получаем возможность контролировать порядок отрисовки слоя и можем выбрать нужный нам проход визуализации (render pass).
Так же не забываем про frame debuger, который позволяет увидеть как рисуется сцена и отладить рендерер.
В итоге мы имеем такой же результат, который мы могли бы получить при использовании нескольких камер, но более производительный, гибкий и без дополнительных камер.
Зачем?
Во-первых: в зависимости от сложности геометрии сцены, несколько одновременно работающих камер могут привести к экспоненциальному росту потребления ресурсов и, как следствие, падению производительности. Благодаря методу, который рассказан в данном посте, разработчик может отказаться от нескольких камер, что приведёт к увеличению производительности.
Во-вторых: реализация через стакинг камер не работает в srp.
Демо
Скачать файлы с видео можно здесь
Где же ручки?
На случай если кто не понял как именно сделать ручки поверх уровня, кратко на примере демо из поста:
Делаем два первых шага из статьи, потом отключаем слой рук в default layer mask, создаём два render object в features, присвоив им слой рук. Далее первому переопределяем глубину с условием greater, второму ничего не переопределяем и оставляем как есть.
Результат: