Home [UE4] RPG 게임처럼 캐릭터 움직임 구현
Post
Cancel

[UE4] RPG 게임처럼 캐릭터 움직임 구현

3인칭 RPG 게임에 자주 사용하는 카메라 회전을 만들어보자

참고 자료

언리얼 엔진 문서 - 캐릭터 동작 함수 구현

1. Input 세팅

  • Project SettingEngine - 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. 결과

카메라 움직임이 적용되어 있습니다.

This post is licensed under CC BY 4.0 by the author.