3인칭 RPG 게임에 자주 사용하는 카메라 회전을 만들어보자
참고 자료
1. Input 세팅
Project Setting
내Engine - Input
에서 확인이 가능하다.Scale
값을 조절해서 정방향과 역방향에 대한 키Value
를 세팅한다.
2. C++ 코드로 세팅 연결하기
- 캐릭터의 움직임을 만들기 때문에 부모 클래스를
Character
로 하여 C++ 클래스로 생성 - 미리 구현되어 있는
SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
메소드를 이용하여 세팅 값을 연결한다.
1
2
3
4
5
6
7
8
9
10
11
12
void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
/** 파라미터는
* 첫번 째: Input 세팅에 작성한 이름
* 두번 째: 적용할 객체(라고 이해했다.)
* 세번 째: Input 값을 이용하여 수행할 메소드
*/
PlayerInputComponent->BindAxis(TEXT("MoveForward"),this,&APlayerCharacter::MoveForward);
PlayerInputComponent->BindAxis(TEXT("MoveRight"),this,&APlayerCharacter::MoveRight);
}
3. 수행할 메소드 구현
BindAxis
메소드의 3번 째 파라미터에서 Input
값을 이용해 수행할 메소드를 보냈고,
이 메소드를 통해 Input
값을 이용하여 캐릭터에 움직임을 부여할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void APlayerCharacter::MoveForward(float value)
{
// 어느 쪽이 전방인지 알아내기 위함
const FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetUnitAxis(EAxis::X);
// 구한 방향을 토대로 Input 값(value)을 더해준다.
AddMovementInput(Direction,FMath::Clamp(value,-1.f,1.f));
}
void APlayerCharacter::MoveRight(float value)
{
// 어느 쪽이 우측인지 알아내기 위함
const FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetUnitAxis(EAxis::Y);
// 구한 방향을 토대로 Input 값(value)을 더해준다.
AddMovementInput(Direction,FMath::Clamp(value,-1.f,1.f));
}
FRotationMatrix 란?
FRotationMatrix
에 대한 내용이 자세하게 적힌 것이 없다 보니 여러 글들을 읽고 나름대로 정리를 해보았다.
위에서 Controller->GetControlRotation()
을 통해 현재 Rotation
값을 가져오고
그 값을 FRotationMatrix
를 통해 회전 행렬로 값을 변환한다.
변환된 회전 행렬에서 원하는 Axis(축)
을 구할 수 있는데 언리얼 엔진에서는 X
축이 전후방, Y
축이 좌우를 담당하고 있다.
그러므로, MoveForward
메소드에서 GetUnitAxis(EAxis::X)
를 통해 전방의 방향인 X
축 방향을 구할 수 있고,
MoveRight
메소드에서 GetUnitAxis(EAxis::Y)
를 통해 우측 방향인 Y
축 방향을 구할 수 있다.
4. 결과
카메라 움직임이 적용되어 있습니다.