Unreal

[Unreal C++] 캐릭터 이동과 카메라 회전 구현하기

푸쿠이 2021. 5. 27. 23:39
사용자 입력 값 받기

축 매핑하기

마우스를 위로 올렸을 때, 카메라가 위로 가면 아래를 비추게 된다.

보통 게임은 위를 보기 위해 마우스를 위로 올린다.

이러한 이유로 값을 반전해주기 위해 LookUp을 -1로 지정했다.

 

입력 이벤트에 함수 바인딩하기

Character 클래스에서 SetupPlayerInputComponent() 를 오버라이딩해서 구현했다.

public:
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

public:
	UFUNCTION()
	void LookUp(float AxisValue);
	UFUNCTION()
	void Turn(float AxisValue);
	UFUNCTION()
	void MoveForward(float AxisValue);
	UFUNCTION()
	void MoveRight(float AxisValue);
void APlayer_Base::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	PlayerInputComponent->BindAxis("LookUp", this, &APlayer_Base::LookUp);
	PlayerInputComponent->BindAxis("Turn", this, &APlayer_Base::Turn);
	PlayerInputComponent->BindAxis("MoveForward", this, &APlayer_Base::MoveForward);
	PlayerInputComponent->BindAxis("MoveRight", this, &APlayer_Base::MoveRight);
}

UFUNCTION 매크로를 쓰지 않아도 잘 동작하지만, 궁금해서 찾아봤다.

언리얼 문서에 이렇게 설명되어있으니, 써주는게 좋은 것 같다.

https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/FirstPersonShooter/2/5/

 

이동 구현하기

캐릭터의 회전 값을 기준으로 앞쪽 방향, 오른쪽 방향을 구했다.

#include "Kismet/KismetMathLibrary.h"

void APlayer_Base::MoveForward(float AxisValue)
{
	FVector Direction = UKismetMathLibrary::GetForwardVector(FRotator(0.0f, GetControlRotation().Yaw, 0.0f));
	AddMovementInput(Direction, AxisValue);
}

void APlayer_Base::MoveRight(float AxisValue)
{
	FVector Direction = UKismetMathLibrary::GetRightVector(FRotator(0.0f, GetControlRotation().Yaw, 0.0f));
	AddMovementInput(Direction, AxisValue);
}

 

카메라 회전 구현하기
void APlayer_Base::LookUp(float AxisValue)
{
	AddControllerPitchInput(AxisValue);
}

void APlayer_Base::Turn(float AxisValue)
{
	AddControllerYawInput(AxisValue);
}

이렇게 하면, 카메라가 제대로 동작하지 않는다.

SpringArm 컴포넌트의 bUsePawnControlRotation 값이 False가 기본 값이기 때문이다.

True로 바꿔주자.

// 캐릭터 클래스의 생성자에 추가한 코드.
SpringArm->bUsePawnControlRotation = true;

 

구현 결과

이동과 카메라는 게임마다 설정이 달라서, 자기 게임에 맞게 값을 세팅해주면 될 것 같다.