본문 바로가기

게임 개발/언리얼 개인 프로젝트-FlightFight

[언리얼 개인 프로젝트-FlightFight/C++] #1. Pawn 설계 - (2) Pawn 조작법

반응형

FlightFight-포스터
<FlightFight 포스터>

비행기, 즉 Pawn의 조작법을 구현해 본다.

<1>. 조작법  (FloatingPawnMovement)

비행기의 작동방식은 우리가 흔히 알고 있는 자동차의 작동방식과 다르다. Throttle이라는 장치도 있을뿐더러, 3개의 축을 기준으로 회전도 한다. 그래서 비행기의 실제 작동 방식과 비슷하게 조작법을 구현하려다가, 그렇게 하면 조작이 너무 어려워지고 난이도가 너무 높아져 게임을 즐길 수 없다고 판단하여, 최대한 간단한 작동 방식으로 구현하였다.

 

Pawn의 움직임을 구현할 때는 FloatingPawnMovement라는 이동 컴포넌트를 사용하였다.

<FloatingPawnMovement 속성 설정>

 

다음과 같이 FloatingPawnMovement 컴포넌트 내에 있는 속성들의 값을 설정해서 최고 속력, 가속 등 수치를 커스텀한다.

 

이제 화면 상단에 위치한 '편집 툴바 -> 프로젝트 세팅 -> 엔진 -> 입력' 경로를 통해 조작 키를 설정해주어야 한다.

조작-키-설정
<조작 키 설정>
<비행기 조작법>

 

위의 사진처럼 키 설정을 해주었다. W를 누르면 서서히 속도가 빨라지고 손을 떼면 서서히 속도가 감소하는, 자동차의 작동 방식과 유사하게끔 Pawn의 움직임을 구현했다.

 

<2>. 회전

근데 막상 회전을 하려다 보니, Roll회전과 Pitch회전이 90도 각도에서 제한이 되는 것이다.

 

회전-제한-영상

 

이유를 찾아보니, Unreal Engine의 Rotation 시스템이 Euler Angles를 기반으로 작동하고, 이는 각도를 처리하는 방식에서 'Gimbal Lock' 문제와 관련이 있기 때문에 적절한 범위를 유지하기 위한 설계적 제한이라고 한다.

풀어서 말하면 '짐벌 락 현상 때문에 PlayerController나 Spring Arm 같은 시스템에서 기본적으로 각도의 제한을 둔다.'

 

 

짐벌락과 오일러 각 (gimbal lock, euler angles)

개요 오일러 각이란? 짐벌락이란? 짐벌락은 왜 생기나? 1. Gimbal 이란? 출처 - [http://ko.wikipedia.org/wiki/%EC%A7%90%EB%B2%8C] 이것이 바로 짐벌이다. 위키에는 단일 축으로 물체가 회전하도록 중심축을 가진

handhp1.tistory.com

 

 

그래서 이 각도에 대한 제한을 풀기 위해, 추가 코드를 작성했다. 카메라의 회전에 제한이 걸려있는 것이기 때문에, PlayerController 클래스에서 각도의 최솟값, 최댓값을 수정해주려 했다.

 

 

  1. ' 최댓값, 최솟값 = 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/C++] #1. Pawn 설계 - (3) 총알 발사

비행기의 조작법 중, 마우스 좌클릭에 해당하는총알 발사를 해보자.언제, 어디서, 무엇을, 어떻게 작동시킬 것인지 생각해 보자.. 총알 구성 (무엇을)너무나 당연하지만, 우선 총알을 발사하려면

lbto.tistory.com

 

반응형