본문 바로가기

Unreal/Udemy 강의

Unreal Engine 5 - C++ 개발자: C++ 학습하고 비디오 게임 제작하기 Section 5-18

포탑(Turret) 회전하기

저번 강의를 통해 얻은 커서 방향으로 포탑을 회전시켜줄 차례이다.

이를 위해서는 먼저 포탑을 조준하려는 방향을 얻어야 한다.

 

이는 포탑에서의 벡터 값과 마우스 커서(히트 위치)의 벡터 값의 차이를 구해 알아낸 방향 벡터를 통해 알 수 있다.

이렇게 구한 방향 벡터를 통해 로테이터 값을 얻을 수 있다.

이때 주의해야할 점이 있는데, 마우스 커서가 플로어를 향할 경우 포탑이 바닥을 가리키게 된다.

우리가 원하는 것은 단순 회전이지 위아래까지 움직이는 것이 아니기에 회전 값을 Yaw(Z 값)만 건드려줄 필요가 있다.

 

이제 직접 구현해보자.

회전 자체는 터렛과 탱크 포탑 모두 필요하기에 베이스폰에서 구현하게 된다.

 

앞서 얘기했듯이 목표 지점과 현재 위치의 차이값이 필요하다.

이를 위해 터렛 메시의 현재 위치를 얻고, 해당 함수의 인풋 매개 변수로 목표 지점 (히트 위치)의 값을 받아서 차이를 구해준다.

이후 해당 방향벡터를 기준으로 .Rotation()을 통해 회전 값을 얻어준다.

 

해당 터렛 메시에 이 회전 값을 세팅해주는데, 이때 우리는 로컬 오프셋으로 추가해주는 것이 아니라 SetWorldRotation 함수를 사용하게 된다.

해당 함수를 사용하는 이유는 우리가 작업한 곳이 월드 스페이스이기 때문이다.

우리는 월드 스페이스에서 터렛 메시의 위치를 구하고, 월드 스페이스인 목표 지점에서 이를 빼주고 있다.

 

이제 컴파일하고 실행해보면 마우스 커서 방향으로 무사히 회전하는 모습을 볼 수 있다.

하지만 여기서 2가지의 경우에서 문제가 존재한다.

 

먼저 탱크 근처에서 마우스를 움직이면 어떤 지점부터 갑자기 아주 빠르게 덜컥거리며 회전하는 것을 볼 수 있다.

이는 우리가 회전 값을 직접 설정하여 생긴 문제이다.

회전 값을 직접 설정하는 대신, FMath에 속한 RInterpTo라는 보간 함수를 사용하여 훨씬 부드럽게 움직이도록 보완해줄 수 있다.

보간 함수에 필요한 것은 현재 회전 값, 목표 회전값, 델타타임, 그리고 보간 속도이다.

델타타임을 함수를 통해 가져오므로, 이에 대한 헤더 파일을 인클루트 해줄 필요가 생긴다.

보간 함수

 

 다음으로 맵의 가장자리로 가서 커서를 움직이다 보면 갑자기 아에 다른 방향으로 포탑이 덜컥인다.

이는 맵의 가장자리 부근에는 히트할 대상이 없기에 발생하는 문제이다. (맵 밖을 가리키게 됨)

따라서 블로킹 볼륨을 추가하며 보이지 않는 벽을 통 평소엔 보이지 않지만, 히트할 장소는 있도록 해준다.

이를 위해 콜리전 프리셋을 체크하며 우리가 사용하는 트레이스 채널인 Visibility에 대해 블록으로 바꿔주어야 한다.

 

추가한 블로킹 볼륨에 대해 크기를 확장하여 혹여나 다른 곳을 가리키지 않도록 해준다.