언리얼에서는 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의 도움을 받았고
컨트롤러의 회전을 가져오는 것이 정답이었습니다.
'게임 개발 공부 > Unreal Engine' 카테고리의 다른 글
TObjectPtr & TSubclassOf & TSoftObjectPtr (0) | 2025.02.05 |
---|---|
콜리전 프리셋 (Collision Preset) (0) | 2025.02.03 |
애니메이션 블루프린트 (0) | 2025.01.27 |
이동을 위한 Input Mapping Context (IMC) 매핑 (0) | 2025.01.24 |
머티리얼의 요소(Element) 추가 (1) | 2025.01.23 |