В этом коротком видео я покажу, как я создал динамический эффект Defocus в Unity, при котором в фокусе остаются только объекты в центре обзора камеры, а остальные размываются.
Видеоверсия этого руководства в настоящее время недоступна на этом языке. Ниже вы можете посмотреть английскую версию с субтитрами; под видео вы найдете перевод расшифровки на русский язык.
Текстовая расшифровка видео
Всем привет! В этом коротком видео я покажу, как я создал динамический эффект Defocus в Unity, при котором в фокусе остаются только объекты в центре обзора камеры, а остальные размываются.
Сейчас я демонстрирую финальный эффект с намеренно усиленным размытием, но этот эффект можно настраивать, и скоро я покажу, как это сделать.

Видео и скрипт были созданы с использованием Unity 2022 и Universal Rendering Pipeline.
Чтобы правильно использовать скрипт, необходимо добавить компонент Volume к Main Camera, чтобы получить доступ к подпункту Depth of Field.

Необходимо изменить режим компонента Defocus на Bokeh, так как этот режим позволяет задать дистанцию фокусировки и другие параметры, делая итоговый эффект более реалистичным.

Давайте отдельно включим параметры Focus Distance и Aperture.

Для Focus Distance можно оставить значение по умолчанию, потому что во время выполнения игры мы будем изменять его через C# скрипт.
Что касается параметра Aperture, важно отметить, что чем ниже это значение, тем сильнее будет эффект выборочной фокусировки, поскольку глубина резкости становится меньше.
Чтобы показать начальный пример с намеренно усиленным эффектом, я установил значение 2.4, но, конечно, вам нужно будет подобрать подходящее значение для вашего проекта после тестирования.
Перед тем как показать код реализации скрипта, я кратко объясню, как он работает.
Скрипт проецирует невидимый луч, называемый Raycast, из камеры в центр кадра виртуальной сцены.
Когда луч сталкивается с объектом, имеющим компонент Collider, он вычисляет расстояние от этого объекта до камеры и записывает это значение в поле Focus Distance подпункта Depth of Field.
Операция очень простая, но важно помнить, что для обнаружения объекты должны иметь компонент Collider. При необходимости его можно перевести в режим Trigger, чтобы эти объекты не мешали движению персонажа.

Теперь давайте посмотрим на очень простой C# скрипт, который я назвал Dynamic Defocus.
Чтобы скрипт корректно работал, необходимо импортировать модули Rendering и Rendering Universal.

Определённые мной приватные переменные используются только для доступа к компоненту Volume и его подпункту Depth of Field, чтобы мы могли изменять его параметры.

Переменные Volume и Depth of Field инициализируются в функции Start скрипта.

Внутри функции Update, которая автоматически выполняется каждый кадр, проецируется луч Raycast.

Объект, с которым происходит столкновение, записывается в переменную hit, но он может отсутствовать, например если пользователь смотрит на фон или на часть сцены, где нет объектов с компонентом Collider.
Поэтому перед тем как присвоить значение Distance переменной hit параметру Focus Distance компонента Depth of Field, необходимо проверить, что Collider у hit не равен null.
Имя объекта, перехваченного лучом, можно получить через компонент Collider переменной hit, затем через его Game Object и далее через свойство name.
После сохранения скрипта проведите тестирование в вашем проекте и настройте значение параметра Aperture, пока не получите желаемый результат.
Надеюсь, это короткое видео было полезным! До скорой встречи!