개요

여러 프로젝트를 참고하여 향상된 입력 시스템을 사용한 캐릭터 이동을 제작 중이었다. 그러나 마우스 상하 움직임이 작동하지 않는 문제, 부자연스러운 카메라 이동 등이 발생하였기에 Unreal Engine 5에서 제공하는 TPS 템플릿을 분석하여 이를 해결하고자 한다.

플레이어 컨트롤러와 폰

  • 플레이어 컨트롤러
    • 컨트롤러가 폰에 빙의(Possess)하는 방식이다. 컨트롤러의 값을 폰에 전달하여 사용하거나, 폰을 개별적으로 움직일 수 있다.
    • Look 동작의 AddControllerYawInput()처럼 이름에 Controller가 포함된 입력 함수는 플레이어 컨트롤러에 입력을 적용시킨다.
    • 캐릭터의 물리적 상태를 관리. 캐릭터는 폰의 특수 유형이라 할 수 있다.

살펴볼 부분

ATPSTestCharacter::ATPSTestCharacter()
{
	// Set size for collision capsule
	GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);
		
	// Don't rotate when the controller rotates. Let that just affect the camera.
	bUseControllerRotationPitch = false;
	bUseControllerRotationYaw = false;
	bUseControllerRotationRoll = false;

	// Configure character movement
	GetCharacterMovement()->bOrientRotationToMovement = true; // Character moves in the direction of input...	
	GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f); // ...at this rotation rate

	// Note: For faster iteration times these variables, and many more, can be tweaked in the Character Blueprint
	// instead of recompiling to adjust them
	GetCharacterMovement()->JumpZVelocity = 700.f;
	GetCharacterMovement()->AirControl = 0.35f;
	GetCharacterMovement()->MaxWalkSpeed = 500.f;
	GetCharacterMovement()->MinAnalogWalkSpeed = 20.f;
	GetCharacterMovement()->BrakingDecelerationWalking = 2000.f;
	GetCharacterMovement()->BrakingDecelerationFalling = 1500.0f;

	// Create a camera boom (pulls in towards the player if there is a collision)
	CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
	CameraBoom->SetupAttachment(RootComponent);
	CameraBoom->TargetArmLength = 400.0f; // The camera follows at this distance behind the character	
	CameraBoom->bUsePawnControlRotation = true; // Rotate the arm based on the controller

	// Create a follow camera
	FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
	FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation
	FollowCamera->bUsePawnControlRotation = false; // Camera does not rotate relative to arm

	// Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) 
	// are set in the derived blueprint asset named ThirdPersonCharacter (to avoid direct content references in C++)
}

해당 프로젝트의 전체적인 모습에 대해서는 다른 블로그에 잘 정리된 글이 많다. 이 글에서 살펴볼 요소들은 아래와 같다.

  • bUseControllerRotation{Pitch/Yaw/Roll}
  • GetCharacterMovement() → bOrientRotationToMovement
  • CameraBoom→bUsePawnControlRotation
  • FollowCamera→bUsePawnControlRotation

이 글의 기본 전제로 마우스는 플레이어 컨트롤러를, 키보드는 폰의 움직임을 제어한다는 것을 알아두자.

bUseControllerRotation

Pawn.h에 정의되어있다. 플레이어 컨트롤러가 있다면 해당 컨트롤러의 회전값을 폰에서도 그대로 사용할 것인지 정하는 옵션이다.

Untitled

Untitled

BP를 살펴보면 bUseControllerRotationYaw 값이 True로 지정되어있다.

  • True 지정 = Pawn의 Yaw값이 컨트롤러의 값을 사용 → 컨트롤러(마우스)회전 시 폰이 해당 방향으로 회전함(이미지 오른쪽).
  • False 지정 = Pawn의 Yaw값이 독립적인 값을 사용 → 컨트롤러를 회전하더라도 폰이 바라보는 방향은 변하지 않음(이미지 왼쪽).

bOrientRotationToMovement

캐릭터 무브먼트에서 지정 가능하다. 캐릭터가 이동하는 방향으로 캐릭터를 회전시킬지 정하는 옵션이다.

Untitled

Untitled

  • True 지정 = 캐릭터가 오른쪽으로 이동할 때, 오른쪽을 바라보도록 회전한 다음 움직인다.
  • False 지정 = 캐릭터가 오른쪽으로 이동할 때, 실제로 오른쪽으로 이동하기는 하지만 캐릭터의 방향은 변하지 않는다.

위의 bUseControllerRotation이 지정되지 않아야한다. 본 옵션보다 위의 옵션이 적용된다.

스프링암 - bUsePawnControlRotation

스프링암이 폰의 회전을 그대로 사용할지 정하는 옵션이다.

Untitled

  • 전부 사용X = 스프링암으로써의 기능은 작동하지만 그 어떠한 회전도 발생하지 않는다. 특정 방향에서 계속 캐릭터를 바라보는 모습.
  • 폰 제어 회전만 사용 = 폰의 값을 가져오지만 컴포넌트 자체는 회전하지 않는다.
  • Pitch, Yaw, Roll 만 사용 = 플레이어 컨트롤러가 움직일 때는 스프링암이 회전하지 않는다. 그래서 마우스를 움직여도 스프링암이 회전하지 않는다. 키보드 입력으로 폰을 회전시켰을 때가 되어서야 스프링암이 회전한다.
  • 전부 사용O = 일반적으로 떠올리는 TPS 동작

카메라 - bUsePawnControlRotation

카메라에도 해당 옵션이 존재한다. 다만 스프링암의 끝부분에 주로 추가하는 컴포넌트이기 때문에, 원하는 효과를 위해서는 위의 옵션과 잘 조합해야한다.

  • 스프링암 폰 제어회전 X / Pitch,Yaw,Roll X / 카메라 폰 제어회전 O

    Untitled

    스프링암은 회전하지 않지만 카메라는 플레이어 컨트롤을 따라 회전한다. 레이싱게임 뷰와 비슷하다.

  • 스프링암 폰 제어회전 X / Pitch,Yaw,Roll O / 카메라 폰 제어회전 O

    플레이어 컨트롤러를 따라서 카메라가 움직인다. 하지만 스프링암은 키보드의 입력을 따라 움직인다.

  • 스프링암 폰 제어회전 O / Pitch,Yaw,Roll O / 카메라 폰 제어회전 O

    일반적으로 떠올리는 TPS 동작. 카메라와 스프링암이 같은 방향을 바라보며 회전하기 때문에 카메라가 회전하지 않는 것과 동일한 결과가 나온다.

개인 문제 해결

  • 마우스를 위아래로 움직여도 카메라가 이동하지 않는다. → 스프링암의 bUsePawnControlRotation = true 지정.
  • 항상 캐릭터의 뒷면만 바라볼 수 있다 → bUseControllerRotation = false 지정.
  • 캐릭터가 가속하는 방향을 바라보게 하고싶다 → bOrientRotationToMovement = true 지정.

참고자료