이 짧은 영상에서 저는 카메라의 중앙에 있는 객체에만 초점을 맞추고, 나머지를 흐릿하게 처리하는 동적 Defocus 효과를 Unity에서 어떻게 만들었는지 보여드리겠습니다.
영상 자막 텍스트
안녕하세요, 여러분! 이 짧은 영상에서 저는 카메라의 중앙에 있는 객체에만 초점을 맞추고, 나머지를 흐릿하게 처리하는 동적 Defocus 효과를 Unity에서 어떻게 만들었는지 보여드리겠습니다.
지금은 흐림 효과를 과장해서 보여드리고 있지만, 이 효과는 사용자 정의가 가능하며 곧 그 방법을 보여드리겠습니다.

이 영상과 스크립트는 Unity 2022와 Universal Rendering Pipeline을 사용하여 제작되었습니다.
스크립트를 제대로 사용하려면 Main Camera에 Volume 컴포넌트를 추가해야 하며, 이를 통해 Depth of Field 하위 컴포넌트에 접근할 수 있습니다.

Defocus 컴포넌트의 모드를 Bokeh로 변경해야 합니다. 이 모드는 초점 거리와 다른 효과를 지정할 수 있어 최종 효과를 더욱 현실감 있게 만듭니다.

이제 Focus Distance와 Aperture 매개변수를 활성화하겠습니다.

Focus Distance는 기본값을 사용할 수 있습니다. 왜냐하면 게임플레이 중에 C# 스크립트를 통해 이 값을 수정할 것이기 때문입니다.
Aperture 매개변수와 관련해서는, 이 값이 낮을수록 선택적 초점 효과가 더 커지며, 이는 깊이의 범위가 더 얕아지기 때문이라는 점을 유념해야 합니다.
앞서 의도적으로 효과를 과장해서 보여드린 예제를 위해, 저는 이 값을 2.4로 설정했습니다. 하지만 테스트 후, 여러분의 프로젝트에 적합한 값을 설정해야 합니다.
스크립트를 구현하기 위한 코드를 보여드리기 전에, 간단히 작동 방식을 설명드리겠습니다.
이 스크립트는 가상의 장면에서 카메라에서 프레임 중앙으로 보이지 않는 Ray를 발사하는 Raycast를 사용합니다.
이 Ray가 Collider 컴포넌트를 가진 객체에 닿으면, 해당 객체와 카메라 사이의 거리를 계산한 후 이 값을 Depth of Field 하위 컴포넌트의 Focus Distance 필드에 기록합니다.
작동은 매우 간단하지만, 객체가 감지되기 위해서는 Collider 컴포넌트를 가져야 하며, 이 컴포넌트를 Trigger 모드로 설정하여 캐릭터의 움직임을 방해하지 않도록 할 수도 있다는 점을 유념해야 합니다.

이제 Dynamic Defocus라고 이름 붙인 매우 간단한 C# 스크립트를 살펴보겠습니다.
스크립트를 제대로 실행하려면 Rendering과 Rendering Universal 모듈을 임포트해야 합니다.

제가 정의한 private 변수들은 Volume 컴포넌트와 그 Depth of Field 하위 컴포넌트에 접근하여 매개변수를 수정하는 데만 사용됩니다.

구체적으로는 Volume과 Depth of Field 변수들이 스크립트의 Start 함수에서 초기화됩니다.

Update 함수 내에서는, 이 함수가 매 프레임 실행될 때마다 자동으로 Raycast가 투사됩니다.

충돌된 객체는 hit 변수에 기록되지만, 예를 들어 사용자가 배경이나 Collider 컴포넌트가 없는 장면의 일부에 초점을 맞추고 있을 경우 객체가 없을 수도 있습니다.
이 때문에, hit 변수의 Distance 값을 Depth of Field 컴포넌트의 Focus Distance 매개변수에 할당하기 전에, hit의 Collider가 null이 아닌지 확인하는 것이 필요합니다.
Ray에 의해 감지된 객체의 이름은 hit 변수의 Collider 컴포넌트에 접근한 후, 그 컴포넌트에서 Game Object로 이동하여 최종적으로 이름에 접근함으로써 검색할 수 있습니다.
스크립트를 저장한 후, 프로젝트에서 몇 가지 테스트를 진행하고 원하는 결과가 나올 때까지 Aperture 매개변수 값을 조정하십시오.
이 짧은 영상이 도움이 되었기를 바랍니다! 곧 다시 만나요!