FPS камера в SRP

На официальном YouTube канале Unity вышло видео демонстрирующее гибкость SRP на примере FPS камеры, которая не обрезает пересекающуюся геометрию игрока и сцены.

Ремарка: хоть ребята из юнити назвали это "создание фпс камеры которая не ...", в видео не рассказывают о создании таких вещей как передвижение игрока, обзор и т.д.
Речь в статье и видео идёт только о решении проблемы пересекающихся геометрий, которая приводит к "проваливанию" конечностей игрока сквозь стены.

Пример демонстрирует отказ от дополнительной камеры, которая занимается отрисовкой только FPS оружия (рук игрока) и достижение того же результата путём настройки рендерера.

Может показаться, что речь идёт о чём-то страшном, но это не так. В примере используется LWRP.

Всего 3 простых шага:

  • Создать кастомный forward renderer
  • В Pipeline asset присвоить созданный в предыдущем шаге рендерер
  • В кастомном рендерере убрать слой оружия из Default Layer Mask и переопределить этот слой как Render Object в Renderer Features
FPS камера в SRP

Таким образом мы получаем возможность контролировать порядок отрисовки слоя и можем выбрать нужный нам проход визуализации (render pass).

Так же не забываем про frame debuger, который позволяет увидеть как рисуется сцена и отладить рендерер.

В итоге мы имеем такой же результат, который мы могли бы получить при использовании нескольких камер, но более производительный, гибкий и без дополнительных камер.

Зачем?

Во-первых: в зависимости от сложности геометрии сцены, несколько одновременно работающих камер могут привести к экспоненциальному росту потребления ресурсов и, как следствие, падению производительности. Благодаря методу, который рассказан в данном посте, разработчик может отказаться от нескольких камер, что приведёт к увеличению производительности.

Во-вторых: реализация через стакинг камер не работает в srp.

Демо

Скачать файлы с видео можно здесь

Где же ручки?

На случай если кто не понял как именно сделать ручки поверх уровня, кратко на примере демо из поста:

FPS камера в SRP

Делаем два первых шага из статьи, потом отключаем слой рук в default layer mask, создаём два render object в features, присвоив им слой рук. Далее первому переопределяем глубину с условием greater, второму ничего не переопределяем и оставляем как есть.

Результат:

Музыка специально под улыбчивое настроение Дмитрия Широбакина :)
4545
24 комментария