Home [UE4] 카메라 회전 및 회전 방향으로 이동 구현
Post
Cancel

[UE4] 카메라 회전 및 회전 방향으로 이동 구현

3인칭 RPG 게임과 같이 카메라 회전을 구현해보자

언리얼 엔진 문서 - 마우스 카메라 컨트롤 구현

1.Input 세팅

  • TurnLookup을 만들기 위해 Mouse X,Y 값을 받아온다.

2. C++ 코드로 세팅 연결하기

  • 캐릭터의 움직임을 만들기 때문에 부모 클래스를 Character로 하여 C++ 클래스로 생성
  • 미리 구현되어 있는 SetupPlayerInputComponent(UInputComponent*PlayerInputComponent) 메소드를 이용하여 세팅 값을 연결한다.
1
2
3
4
5
6
7
8
9
10
11
void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	PlayerInputComponent->BindAxis(TEXT("MoveForward"),this,&APlayerCharacter::MoveForward);
	PlayerInputComponent->BindAxis(TEXT("MoveRight"),this,&APlayerCharacter::MoveRight);

	PlayerInputComponent->BindAxis(TEXT("Turn"),this,&APlayerCharacter::AddControllerYawInput);
	PlayerInputComponent->BindAxis(TEXT("LookUp"),this,&APlayerCharacter::AddControllerPitchInput);
	
}

AddControllerYawInput ?

AddControllerPitchInput ?

3. 추가적인 세팅

  • 아래와 같이 추가적으로 SpringArmCamera 세팅을 했다. (생성자에 작성)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    // Sets default values
    APlayerCharacter::APlayerCharacter()
    {
     	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
      PrimaryActorTick.bCanEverTick = true;
    
      // Component Init
      SpringArmComponent = CreateDefaultSubobject<USpringArmComponent>(TEXT("Springarm"));
      SpringArmComponent->SetupAttachment(GetRootComponent());
      SpringArmComponent->TargetArmLength = 500.f;
      SpringArmComponent->bUsePawnControlRotation = true;
    
      CameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
      CameraComponent->SetupAttachment(SpringArmComponent);
      CameraComponent->bUsePawnControlRotation = false;
    
      // Camera Setting
      bUseControllerRotationPitch = false;
      bUseControllerRotationRoll = false;
      bUseControllerRotationYaw = false;
    }
    

    여기서 bUsePawnControlRotationbUseControllerRotationPitch 를 볼 수 있는데 두 내용이 애매해 따로 정리해보았다.

bUseControllerRotation(Pitch/Yaw/Roll)

bUserControllerRotationPitch를 예를 들어 설명 Pitch, Yaw, Roll 모두 동일하다.

만약 bUseControllerRotationPitch = true 라면,
폰의 Pitch 값은 컨트롤러의 ControlRotation pitch값에 맞추어 업데이트 된다.

이런 내용이 발생한 이유는 언리얼에선

  • 컨트롤러 - 캐릭터 조작을 담당(Ex. 회전)
  • 폰 - 캐릭터의 물리적인 내용을 담당

이렇게 구분하여 처리를 하고 있고, 그러므로 컨트롤러에 값을 폰에 적용할 것인지를 묻는 것이다.

bUsePawnControlRotation

  • USpringArmComponent 또는 UCameraComponent세팅에서 확인할 수 있는데 에디터에서 아래와 같이 설명하고 있다.
    ( 아래 이미지는 USpringArmComponent 툴팁 내용이다. UCameraComponent 툴팁도 아래와 동일한 내용이다. )

툴팁 내용을 보면 @See APawn::GetViewRotation()을 볼 수 있는데 아래와 같이 작성되어 있다.

1
2
3
4
5
/**
* Get the view rotation of the Pawn (direction they are looking, normally Controller->ControlRotation).
* @return The view rotation of the Pawn.
*/
virtual FRotator GetViewRotation() const;

주석 내용을 보았을 때, Pawn 기준으로의 rotation 값을 가져오는 것으로 이해했다.

결과

  • 결과를 보면 알 수 있듯이, 카메라 회전에 맞추어 캐릭터가 회전하지 않아 어색함을 느낄 수 있다.

4. 카메라 회전에 맞추어 캐릭터 방향 돌리기

  • CharacterMovementOrientRotationToMovement 를 이용하여 세팅한다.
1
2
3
4
5
6
7
8
9
// Sets default values
APlayerCharacter::APlayerCharacter()
{
	// 위에 작성된 내용은 생략했습니다.
    
	// Character Movement Setting
	GetCharacterMovement()->bOrientRotationToMovement = true;
	GetCharacterMovement()->RotationRate=FRotator(0.f,360.f,0.f);
}

OrientRotationToMovement

언리얼 엔진 문서 - bOrientRotationToMovement

  • true인 경우, RotationRate를 회전 변경 속도로 사용하여 캐릭터를 가속 방향으로 회전한다.

즉, 이 값을 true로 할 경우
자동적으로 캐릭터가 이동하려는 방향에 맞추어 캐릭터를 회전 시켜 이동 방향을 향하게(이동 방향이 전방이 되게) 설정해준다.

RotationRate

OrientRotationToMovement의 설명에 적혀 있는 RotationRate를 의미한다.
RotationRate 값을 어떻게 주냐에 따라 캐릭터의 회전 속도를 조절할 수 있다.

결과

  • 정상적으로 카메라 회전 방향에 맞추어 캐릭터도 회전하는 것을 볼 수 있다.
This post is licensed under CC BY 4.0 by the author.