슈팅 게임에서 빠질 수 없는 Sniper 무기를 구현해보자. 가장 기본적인 기능인 Sniper Aim 상태, Aim시 Scope 배율을 조정해서 조준경 확대, 마지막으로 발사까지 구현해보자.

Sniper Aim 모션

기존 개발하던 TPS 기반의 게임에서 Sniper Aim 상태로 전환하려면 어떻게 할지 고민을 좀 했었다. FPS였다면 총기 전환을 할때 원래 가지고 있었던 무기가 캐릭터 시점에서 없어진 시점 이후에는 그 무기의 행방이 랜더링 되지 않아 따로 처리해 주지 않아도 된다. 하지만 TPS에는 카메라가 캐릭터의 뒤까지 다 비추어주고 있어서 이 문제를 해결해야 했다.

일단 디테일한 부분까지는 잡지 못했지만, Idle 상태에서 Sniper를 Aim하고자 할때 원래 캐릭터를 비추고 있던 카메라의 spring arm의 길이와 카메라의 socket offsetTimelineLerp를 사용해 Rifle Firing을 구현했던 것처럼 만들었다. 또한, 이번에는 Aim시 카메라의 FOV까지 줄여 화면 확대를 더 표현해보고자 했다(FOV와 카메라의 확대 관계에 대해서는 밑에서 설명하도록 하겠다).

Render Target과 FOV로 조준경 만들기

이제 Aim 모션을 만들었다면 저격총 렌즈를 통해 사물을 볼 수 있어야 한다. 미니맵 구현에서 했던 것처럼 Scene Capture Component 2D Camera를 사용해서 Render Target을 만들어보자.

Scope에 보여질 Material를 결정할 Scene Capture Camera

Sniper Rifle Blueprint를 만들어서 여기에 Sniper Rifle Skeletal Mesh를 Root로, 하위 자식으로는 Scope와 Camera를 배치한다.

BP에서 다른 BP attach 하는 방법

외부 BP를 캐릭터 BP에 다는 방법은 Actor Component를 사용해서 한다. Actor Component를 캐릭터 BP에 먼저 부착하고 이 Actor Component의 자식을 사용하고 싶은 외부 BP로 설정하면 된다.

만약, 이 캐릭터 BP에서 Actor Component의 자식으로 부착된 외부 BP에 접근하고 싶다면 Actor Component에서 Child Actor를 가져와 해당 BP로 Casting한다. Casting에서 반환된 오브젝트에서는 해당 BP의 함수, 변수들에 접근할 수 있다(Public으로 설정되어야 함을 명심!).

확대 기능 만들기

고정 배율을 가지고 있는 Sniper를 만들어도 되지만, 우리가 만들 Sniper는 보통 Sniper가 아니기 때문에 확대 기능까지 추가해 볼 것이다. 이를 위해서는 카메라가 사물을 어떻게 투영시키는지에 대한 기초적인 지식이 필요하다.

FOV, Focal Length, Sensor height의 관계

카메라가 사물을 투영시키는 과정을 한번 봐야지 투영되는 상의 크기에 영향을 미치는 요인들을 알 수 있을 것이다. 우선 카메라가 찍고 있는 사물의 크기는 우리가 바꿀 수 없기 때문에 우리가 바꿀 수 있는 요인들을 살펴보자.

먼저, 렌즈의 시야(Field Of View)가 있다. 직관적이게 FOV가 크면 넓은 화각이, FOV가 작으면 작은 화각이 나오게 된다.

두번째로는 Focal length(초점 거리)가 있다. 이는 렌즈와 센서 사이의 거리인데, 센서에 물체가 투영된다고 생각하면 된다. 같은 FOV라도 focal length가 짧으면 해당 물체가 그만큼 작게 보인다.

FOV와 Focal Length, 투영된 사물의 크기의 관계식은 사진에서 보는 것처럼 tangent를 사용해서 표현 가능하다.

마우스 Scroll과 Scene Capture 2D의 FOV mapping

왜인지는 모르겠지만 언리얼의 Scene Capture Camera에서는 Focal Length를 조절하는 부분을 찾지 못했다. 따라서 FOV를 조절하면서 배율 사이즈를 결정하기로 하였고 이에 대한 별도의 Input(마우스 scroll)을 만들었다.

이번에 Scroll Input을 처음 사용해 보았는데 신기하게도 위로 scroll 할 것인지 아래로 scroll 할 것인지 따로 정하지 않았는데 위로 scroll하면 BP에 적힌 로직이, 아래로 scroll하면 그 반대의 로직이 자동으로 실행되었다.


최종화면

조준하는 Aim 화면이 마음에 들지 않아서 Aim 되었을시 카메라의 FOV를 좀 더 낮추었고 사격시 데미지(Rifle의 보다 높게), 사격 효과와 카메라 shake까지 추가하였다.

화면상에서는 확인이 어렵지만 사격당한 홀로그램 적군은 안타깝게 즉사하였다.

profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

1개의 댓글

comment-user-thumbnail
2024년 9월 2일

멋져요!

답글 달기