비행기, 즉 Pawn의 조작법을 구현해 본다.
<1>. 조작법 (FloatingPawnMovement)
비행기의 작동방식은 우리가 흔히 알고 있는 자동차의 작동방식과 다르다. Throttle이라는 장치도 있을뿐더러, 3개의 축을 기준으로 회전도 한다. 그래서 비행기의 실제 작동 방식과 비슷하게 조작법을 구현하려다가, 그렇게 하면 조작이 너무 어려워지고 난이도가 너무 높아져 게임을 즐길 수 없다고 판단하여, 최대한 간단한 작동 방식으로 구현하였다.
Pawn의 움직임을 구현할 때는 FloatingPawnMovement라는 이동 컴포넌트를 사용하였다.
다음과 같이 FloatingPawnMovement 컴포넌트 내에 있는 속성들의 값을 설정해서 최고 속력, 가속 등 수치를 커스텀한다.
이제 화면 상단에 위치한 '편집 툴바 -> 프로젝트 세팅 -> 엔진 -> 입력' 경로를 통해 조작 키를 설정해주어야 한다.
위의 사진처럼 키 설정을 해주었다. W를 누르면 서서히 속도가 빨라지고 손을 떼면 서서히 속도가 감소하는, 자동차의 작동 방식과 유사하게끔 Pawn의 움직임을 구현했다.
<2>. 회전
근데 막상 회전을 하려다 보니, Roll회전과 Pitch회전이 90도 각도에서 제한이 되는 것이다.
이유를 찾아보니, Unreal Engine의 Rotation 시스템이 Euler Angles를 기반으로 작동하고, 이는 각도를 처리하는 방식에서 'Gimbal Lock' 문제와 관련이 있기 때문에 적절한 범위를 유지하기 위한 설계적 제한이라고 한다.
풀어서 말하면 '짐벌 락 현상 때문에 PlayerController나 Spring Arm 같은 시스템에서 기본적으로 각도의 제한을 둔다.'
그래서 이 각도에 대한 제한을 풀기 위해, 추가 코드를 작성했다. 카메라의 회전에 제한이 걸려있는 것이기 때문에, PlayerController 클래스에서 각도의 최솟값, 최댓값을 수정해주려 했다.
- ' 최댓값, 최솟값 = 180.0f '
'90도 제한이니, 쭉 움직이게 하려면 제한을 180도로 해주면 되겠지?'라는 생각이었지만, 제한을 180도로 했을 때는 회전이 아예 되지 않았다. 일단 여기서 알아야 할 것은 '카메라의 회전은 0 ~ 360도가 아니라 -180 ~ 180도의 범위를 가진다.'이다.
따라서 -180도를 정규화하면 180이기 때문에 값이 겹쳐서 180도가 돼서 회전이 아예 안 됐다는 것을 알 수 있다.
2. ' 최댓값, 최솟값 = 179.0f '
'그럼 179도로 하면 되려나?'라는 생각으로 제한을 179도로 했을 때는 회전이 전보다는 더 돌아가지만, 180도 회전 지점에서 회전이 막히고 말았다.
일반적으로 생각해 보았을 때, -179 ~ 179라면 0 ~ 179와 181 ~ 360의 범위이다. 179에서 181로 회전하기 위해서는 2 이상의 입력이 필요한데, 지금은 소수점 단위 입력으로 처리를 하기 때문에 회전이 막혔다는 것을 알 수 있다.
3. ' 최댓값, 최솟값 = 179.99f '
위의 착오들을 거치고 제한 범위를 소수점 단위까지 확장하여 179.99로 하니, 드디어 정상적으로 회전이 가능해졌다.
void AFFPlayerController::BeginPlay()
{
Super::BeginPlay();
PlayerCameraManager->ViewPitchMax = 179.99f;
PlayerCameraManager->ViewPitchMin = -179.99f;
PlayerCameraManager->ViewRollMin = -179.99f;
PlayerCameraManager->ViewRollMax = 179.99f;
}
각도 제한을 수정하는 C++ 코드는 다음과 같다.
※ 다음 챕터
'게임 개발 > 언리얼 개인 프로젝트-FlightFight' 카테고리의 다른 글
[언리얼 개인 프로젝트-FlightFight/C++] #1. Pawn 설계 - (4) 추가 이펙트(Niagara System) (0) | 2025.01.02 |
---|---|
[언리얼 개인 프로젝트 - FlightFight/C++] #1. Pawn 설계 - (3) 총알 발사 (0) | 2024.12.24 |
[언리얼 개인 프로젝트-FlightFight / C++] #1. Pawn 설계 - (1) Pawn 구성 (0) | 2024.11.28 |
[언리얼 개인 프로젝트-FlightFight / C++] #0. 프로젝트 기획 (0) | 2024.07.15 |