학습일지/언리얼

Unreal - Pawn 클래스 과제

Tsukino Ren 2026. 4. 14. 23:32

Pawn Class / Character Class

Character Class

  • Character Class 는 Capsule, mesh, movement가 기본 내장되어 있다.

Pawn Class

  • Pawn Class 는 완전히 비어있기에 직접 추가해 줘야 한다
  • 비행체 같은 커스텀 이동객체는 Pawn이 사용하기 좋다.

컴포넌트

CapsuleComp = CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleComp"));
SetRootComponent(CapsuleComp);
CapsuleComp->SetSimulatePhysics(false);

SkeletalMeshComp = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("SkeletalMeshComp"));
SkeletalMeshComp->SetupAttachment(CapsuleComp);
SkeletalMeshComp->SetSimulatePhysics(false);

SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArmComp"));
SpringArmComp->SetupAttachment(CapsuleComp);
SpringArmComp->SetRelativeRotation(FRotator(0.f, 0.f, 0.f));
SpringArmComp->bUsePawnControlRotation = false;

CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("CameraComp"));
CameraComp->SetupAttachment(SpringArmComp);
CameraComp->bUsePawnControlRotation = false;
  • 루트의 움직임에 맞춰 컴포넌트들이 전부 따라 이동한다.

Vector3D

시간

CurrentDeltaTime = DeltaTime;

FVector StartLocation = GetActorLocation();
FVector EndLocation = StartLocation + FVector(0.0f, 0.0f, -100.0f);
FHitResult HitResult;
FCollisionQueryParams Params;
Params.AddIgnoredActor(this);

 

이동

AddActorLocalOffset(GetActorForwardVector() * Input.X * MoveSpeed * CurrentDeltaTime);
AddActorLocalOffset(GetActorRightVector() * Input.Y * MoveSpeed * CurrentDeltaTime);
AddActorLocalOffset(GetActorUpVector() * Input.Z * MoveSpeed * CurrentDeltaTime);

 

회전

AddActorLocalRotation(FRotator(
	Input.Y * LookSpeed * CurrentDeltaTime,
	Input.X * LookSpeed * CurrentDeltaTime, 
	Input.Z * LookSpeed * CurrentDeltaTime));

 

중력 구현

bIsGround = GetWorld()->LineTraceSingleByChannel(
	HitResult, StartLocation, EndLocation, ECC_Visibility, Params);

if (bIsGround)
{
	VerticalVelocity = 0.0f;
}
else
{
	VerticalVelocity += Gravity * DeltaTime;
}
  • DeltaTime을 활용하여 컴퓨터의 성능에 맞춰 프레임마다 속도를 조절함
  • Local 이동을 통해 Pawn이 바라보는 방향을 기준으로 움직임
  • 공중 상태에서 이동속도 제한으로 에어컨트롤 구현

마무리

캐릭터를 Vector2D로만 구현해보다가 Vector3D를 써보니 처음에 구현을 잘못해 이상하게 돌고 상승하라니까 하강하고 있고 그랬는데 Swizzle과 Nagate를 잘못 설정한것 그리고 Local 이동과 World 이동 기준인 forwardVector를 같이 쓰다보니 캐릭터가 바라보는 방향으로 이동을 안하고 엉뚱하게 이동하는 문제들이 많았다. 후 World 이동으로 전부 변경하여 문제를 해결했다.

AddActorLocalOffset -> AddActorWorldOffset 로 수정

 

비행체인데 공중에서 이동속도를 느려지게 하는게 맞나 싶었는데 생각해보면 중력 + 공기저항을 코드로 표현한 것이니 틀린 것도 아닌 것 같다. 실제 비행체라면 공중에서 더 빠른 기동이 자연스러우니 공중에서만 가능한 부스터 로직을 추가하는 것도 괜찮을 것같다.