
저번 글에 이어서 직접 해보기 항목을 진행해 보자
언리얼5-32 C++ <Cpp 튜토리얼 - 플레이어 제어 카메라(1)>
직접 해보기 항목은 굉장히 많이 있는데 , 이번에는 간단한 항목 2가지 정도만 해보자
- 달리기 키 부여하기
- 플레이어 오브젝트 뒤에 따라오는 카메라 제작
먼저 달리기 키를 부여하기 위해 Action Mappings에서 Sprint라는 이름으로, Left Shift 키를 넣어준다
그리고 폰 클래스의 헤더파일에서 달리기 키를 눌렀을 때 이동 속도가 증가할 수 있도록 SpeedFactor 변수와
달리기 키를 눌렀을 때 작동하는 StartSprint( ) 함수, 키를 뗐을 때 작동하는 StopSprint( ) 함수를 선언한다
이 값들을 사용하기 위해 소스파일의 Tick함수에서 SpeedFactor을 곱해서 이 값에 따라 오브젝트의 이동속도를 조절하도록 하고,
오브젝트의 기본속도를 설정하기 위해 생성자함수에서 SpeedFactor 변수를 1.0f 값으로 지정해 준다
그리고 StartSprint( ) 함수와 StopSprint( ) 함수를 구현해 주는데, Shift 키를 눌렀을 때 SpeedFactor가 3.0f값을 할당하게 하고,
키를 뗐을 때 SpeedFactor가 원래 속도인 1.0f을 할당하게 한다
마지막으로 SetupPlayerInputComponent 함수에서 바인딩했던 값들을 사용하도록 코드를 작성한다
코드를 모두 작성하면 저장하고 언리얼 에디터에서 컴파일해 준다
게임을 플레이한 후에, 그냥 움직일 때와는 다르게 Shift키를 누르면 마치 달리듯이 속도가 빨라지는 것을 볼 수 있다
두 번째 과제로 카메라에 일정량의 자동회전을 적용하여 카메라가 이동 중인 플레이어 오브젝트 뒤로 점진적으로 자리 잡고 플레이어가 이동하는 방향을 향하도록 하는 것이다
과제만 들으면 헷갈릴 수 있으니 우선 진행해 보자
먼저 소스파일에 Tick함수에서 FVector 타입의 DesiredForward 변수를 선언해 주고, GetActorForwardVector() 함수를 할당한다
[GetActorForwardVector() 함수는 해당 액터의 전방향 벡터(액터가 현재 바라보고 있는 방향을 나타내는 단위벡터)를 반환하는 역할을 하는데, 액터가 오른쪽으로 회전하면 전방향 벡터도 오른쪽을 가리키게 되는 등 액터의 회전상태에 따라 달라진다.
그래서 이 함수는 액터의 전방향에 따른 움직임이나 계산을 구현하는 데 사용된다]
그리고 X축 및 Y축에서 얻은 이동 입력을 사용하여 새로운 전방향 벡터를 생성한다
GetComponentRotation() 함수로 현재 컴포넌트의 카메라 회전을 가져와서 CurrentRotation 변수에 저장해 주고, 앞서 계산한 DesiredForward 벡터를 기반으로 플레이어가 이동하고자 하는 방향에 대한 회전값을 DesiredRotation 변수에 저장해 준다
이제 헤더파일로 가서 카메라가 자동회전할 속도를 위해 CameraAutoRotationSpeed 변수를 3.0f;로 초기화 하고,
UPROPERTY 매크로를 붙이고 EditAnywhere, BlueprintReadWrite, Category = "Camera" 지정자를 넣어 에디터에서 이 속도를 수정할 수 있도록 만들어준다
그리고 RInterpTo 함수를 사용하여 이동에 따라 카메라가 부드럽게 회전을 할 수 있도록 코드를 작성한다
FMath::RInterpTo는 회전 값을 보간(두 값 사이의 중간값을 계산하는 과정)하는 함수로, 현재 회전에서 목표 회전까지 시간에 따라 부드럽게 보간 된 값을 반환한다
[CurrentRotation: 현재 회전값, DesiredRotation: 목표 회전값, DelatTime: 프레임 간격에 따른 시간, CameraAutoRotationSpeed: 회전속도 (보간에 사용되는 속도)]
마지막에는 계산된 새로운 회전 값을 SpringArmComp에 설정(Set)하여 카메라를 부드럽게 회전시킨다
코드 작업이 완료되면 모두 저장하고 컴파일해 준다
게임을 플레이하고 WASD 키를 눌러보면 카메라가 오브젝트 이동 방향으로 자동으로 회전하는 것을 알 수 있다
[디테일 패널의 Camera섹션에서 회전속도로 선언했던 CameraAutoRotationSpeed 값을 변경해 보면, 키를 누르고 뗄 때 움직이는 카메라의 속도를 변경시킬 수 있다. (너무 속도를 올리면 카메라가 덜덜 떨릴 수 있음에 주의한다)]
하지만 이전에 주었던 기능인 달리기, 줌 인/아웃, 마우스 X축은 정상적으로 동작하는데, 마우스 Y축값을 변경시키려고 움직이면
그 값에 고정되지 않고 다시 일정한 값으로 돌아가려는 것이 느껴질 것이다
이 이유는 사실 카메라의 자동회전을 적용시킬 때, 방향키로 이동시킨 후 키를 떼면 다시 원래대로 카메라가 돌아오는 것처럼
카메라의 기본 회전 각도도 다시 돌아오게 돼서, 제아무리 카메라 Y축을 움직여도 기본 회전 각도로 다시 돌아오게 되는 것이다
그래서 이 문제를 해결하기 위해 카메라의 상하 방향 회전(Pitch) 값을 저장할 새로운 변수를 도입해서 마우스 입력이 없을 때에도 마지막으로 입력받은 Pitch값으로 유지되도록 만들면 된다
먼저 헤더파일에 Pitch값을 저장할 float 타입인 CameraPitch 변수를 선언해 준다
그리고 소스파일의 PitchCamera() 함수에서 CameraPitch값에 AxisValue를 더한 값을 Clamp( ) 함수를 이용하여 제한시켜 주고 이 값을 다시 CameraPitch값에 넣어준다
마지막으로 이렇게 구한 CameraPitch값을 DesiredRotation.Pitch, 즉 해당 벡터의 전방향 값으로 넣어주게 되면 마우스 입력에 따라 CameraPitch값을 사용하여 카메라의 Pitch값을 계속 업데이트 하게 되면서 마우스의 Y축이 고정되지 않는다
코드를 작성하면 모두 저장하고 컴파일해 준다
게임을 플레이해보면 Pitch값도 마우스의 움직임에 따라 자연스럽게 움직일 수 있고, 거기에 맞춰서 카메라가 이동하는 것도 정상적으로 동작하는 것을 볼 수 있다
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!