내일배움캠프_Unreal/TIL

내일배움캠프_Unreal/TIL - Day 56 (260219)

하임 2026. 2. 19. 21:07

1. 쿼터뷰(Top-Down) 시점과 이동 로직 구현

디아블로/로스트아크와 같은 쿼터뷰 시점에서 캐릭터가 마우스 방향을 보더라도 이동은 키보드(WASD)의 절대 방향(8방향)으로 움직여야 하는데, 처음에는 SpringArm이 캐릭터의 회전을 그대로 따라가는 바람에 캐릭터가 뒤를 돌면 카메라도 같이 돌아가서 화면이 어지러운 현상이 발생했다. 따라서 아래와 같이 해결했다.

  1. 카메라 고정: SpringArm의 회전 상속(Inherit Yaw)을 꺼서 카메라는 항상 고정된 각도를 유지하게 한다.
  2. 월드 기준 이동: 컨트롤러의 방향이 아닌, 월드 좌표계(Vector::ForwardVector)를 기준으로 이동 입력을 처리한다.

KirboCharacter.cpp (생성자 & 이동 함수)

AKirboCharacter::AKirboCharacter()
{
    // ...
    SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
    SpringArmComp->SetupAttachment(RootComponent);
    
    // 캐릭터가 회전해도 카메라는 돌지 않도록 설정
    SpringArmComp->bInheritPitch = false;
    SpringArmComp->bInheritYaw = false; 
    SpringArmComp->bInheritRoll = false;

    // 캐릭터는 이동하는 방향을 바라보도록 설정
    bUseControllerRotationYaw = false;
    GetCharacterMovement()->bOrientRotationToMovement = true;
}

void AKirboCharacter::Move(const FInputActionValue& Value)
{
    FVector2D MovementVector = Value.Get<FVector2D>();

    if (Controller != nullptr)
    {
        // 컨트롤러 회전과 무관하게, 월드 절대 좌표 기준으로 이동
        AddMovementInput(FVector::ForwardVector, MovementVector.X); // W/S
        AddMovementInput(FVector::RightVector, MovementVector.Y);   // D/A
    }
}

2. 애니메이션 Aim Offset 문제 수정

마우스 커서 위치를 바라보는 조준(Aiming) 시스템을 구현했으나, 캐릭터가 정면을 보지 않고 바닥으로 45도 정도 고개를 푹 숙이고 다니는 현상이 발생했다. 확인해보니 기존 AnimBP의 GetBaseAimRotation 노드가 카메라 각도를 "아래를 쳐다보라"고 명령하고 있었다.

 

Character 스크립트에서 이미 SetActorRotation으로 캐릭터 몸통 전체를 마우스 방향으로 돌리고 있으므로, AnimBP의 AimOffset 로직에서 Pitch와 Yaw 연결만 끊어주면 해결될 거 같아 수행했다.

  • 기존: GetBaseAimRotation -> AimOffset Pitch/Yaw 연결
  • 수정: 연결 해제 (Pitch, Yaw 값을 0으로 고정)

KirboCharacter.cpp (마우스 조준 로직)

void AKirboCharacter::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    if (bIsShooting) // 사격 중에만 마우스 방향을 바라봄
    {
        APlayerController* PC = Cast<APlayerController>(GetController());
        FHitResult Hit;
        if (PC && PC->GetHitResultUnderCursor(ECC_Visibility, false, Hit))
        {
            FVector LookDir = Hit.ImpactPoint - GetActorLocation();
            LookDir.Z = 0.f; // 높이 차이 무시 (평면 회전)
            SetActorRotation(FRotationMatrix::MakeFromX(LookDir).Rotator());
        }
    }
}

M1 마무리 및 M2 계획

  • 완료: 이동, 대시(쿨타임), 스탯 시스템, 시점 고정, 데이터 테이블 연동.
  • 예정 (M2): 무기 장착 및 사격 로직, 적(Enemy) 피격 판정, UI 위젯 바인딩.