게임 개발 공부/Unreal Engine

Pawn으로 캐릭터 이동과 회전 구현

Vetenir 2025. 1. 31. 21:38

언리얼에서는 Pawn을 상속하는 Character 클래스가 있습니다.

Character 클래스는 캐릭터를 구현하기 쉽도록 제공하는 여러 기능들이 들어있고

특히 CharacterMovementComponent가 있어서 이동을 구현이 비교적 쉽습니다.

하지만 Character 클래스는 사람 형태의 캐릭터에 특화되어있어서

차량, 비행기처럼 비인간형의 이동을 구현할 때는 Pawn으로 구현하는 것이 좋습니다.

 

오늘은 CharacterMovementComponent와 AddControllerYawInput(), AddControllerPitchInput()를 사용하지 않고

이동(WASD)과 회전(마우스 이동)을 구현했습니다.

 

이동

void ACppPawn::Move(const FInputActionValue& value)
{
	if (!Controller) return;

	const FVector2D MoveInput = value.Get<FVector2D>();

	// 현재 위치 가져오기
	FVector CurrentLocation = GetActorLocation();

	// 이동 방향 계산
	FVector MoveForward = GetActorForwardVector() * MoveInput.X * 10.0f; // 속도 조절 (10.0f 조정 가능)
	FVector MoveRight = GetActorRightVector() * MoveInput.Y * 10.0f;

	// 새 위치 설정
	SetActorLocation(CurrentLocation + MoveForward + MoveRight, true);
}

회전

void ACppPawn::Look(const FInputActionValue& value)
{
	// 마우스의 X, Y 움직임을 2D 축으로 가져옴
	FVector2D LookInput = value.Get<FVector2D>();

	// 컨트롤러가 유효한지 확인
	if (Controller && Controller->IsLocalPlayerController())
	{
		// 현재 컨트롤러의 회전 값을 가져옴
		FRotator CurrentRotation = Controller->GetControlRotation();
		// 회전 속도 조절
		float RotationSpeed = 1.0f;

		// Yaw 입력 처리 (좌우 회전)
		float YawInput = LookInput.X * RotationSpeed;
		CurrentRotation.Yaw += YawInput;

		// Pitch 입력 처리 (상하 회전)
		float PitchInput = LookInput.Y * RotationSpeed;
		CurrentRotation.Pitch += PitchInput;

		// Pitch 회전을 범위 제한
		CurrentRotation.Pitch = FMath::ClampAngle(CurrentRotation.Pitch, -90.0f, 90.0f);

		// 컨트롤러의 회전 값을 업데이트
		Controller->SetControlRotation(CurrentRotation);
		SetActorRotation(CurrentRotation);
	}
}

 

결과

 

오늘은 Pawn 클래스로 캐릭터의 이동과 회전을 구현해봤습니다.

사람 캐릭터라서 이상하게 보이지만 드론이라고 생각한다면...

 

화면 회전을 위해 스프링암의 회전값을 가져오는 줄 알고 계속 했었는데

어떻게 해도 회전이 먹지 않고 캐릭터가 회전하거나 캐릭터가 마우스로 움직이거나 했습니다.

결국에는 DeepSeek의 도움을 받았고

컨트롤러의 회전을 가져오는 것이 정답이었습니다.