3인칭 RPG 게임과 같이 카메라 회전을 구현해보자
1.Input 세팅
Turn
과Lookup
을 만들기 위해 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 ?
- 로컬 PlayerController인 경우 컨트롤러의 ControlRotation에 입력(Yaw에 영향)을 추가한다. 언리얼 엔진 문서 - APawn::AddControllerYawInput
AddControllerPitchInput ?
- 로컬 PlayerController인 경우 컨트롤러의 ControlRotation에 입력(Pitch에 영향)을 추가한다. 언리얼 엔진 문서 - APawn::AddControllerPitchInput
3. 추가적인 세팅
- 아래와 같이 추가적으로
SpringArm
과Camera
세팅을 했다. (생성자에 작성)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; }
여기서
bUsePawnControlRotation
과bUseControllerRotationPitch
를 볼 수 있는데 두 내용이 애매해 따로 정리해보았다.
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. 카메라 회전에 맞추어 캐릭터 방향 돌리기
CharacterMovement
의OrientRotationToMovement
를 이용하여 세팅한다.
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 값을 어떻게 주냐에 따라 캐릭터의 회전 속도를 조절할 수 있다.
결과
- 정상적으로 카메라 회전 방향에 맞추어 캐릭터도 회전하는 것을 볼 수 있다.