В этом коротком видео я покажу, как я создал динамический эффект 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, пока не получите желаемый результат.

Надеюсь, это короткое видео было полезным! До скорой встречи!

Поиск по учебным материалам

Введите фразу или несколько ключевых слов через запятую.

Это личный сайт, и он не является каналом продаж. На страницах, посвящённых 3D-моделям, представлена информация о некоторых моих работах; они не содержат предложений, цен, способов приобретения или коммерческих ссылок. В настоящее время я не принимаю заказы на индивидуальные работы, консультации или иные формы профессионального сотрудничества.


РАСШИРЕННАЯ ИНФОРМАЦИЯ О ПОЛИТИКЕ КОНФИДЕНЦИАЛЬНОСТИ И ИСПОЛЬЗОВАНИИ ФАЙЛОВ COOKIE