티스토리 뷰

🟩 오늘의 목표

  • 과제 중 발생한 기술적 문제들을 해결하며 프로퍼티 시스템좌표계를 심화 학습한다.
  • GameMode의 역할과 우선순위를 이해하고 프로젝트 전반의 규칙을 설정한다.
  • PawnCharacter의 차이를 명확히 구분하고, 3인칭 시점의 카메라 시스템을 구축한다.

 

🟧 1. 트러블슈팅: 과제 이슈 해결


 

🟦 에디터 노출 및 편집 이슈

  • UPROPERTY 매크로: 매크로는 바로 다음에 오는 단 하나의 문장에만 적용되므로, 여러 변수를 노출하려면 각 변수마다 매크로를 명시해야 함을 확인했다.
  • Movable 가동성: 액터를 코드나 블루프린트로 제어하려면 반드시 Movable 설정을 활성화해야 하며, 이를 위해 해당 컴포넌트가 UPROPERTY로 노출되어 있어야 한다.

🟦 이동 로직 및 환경 동기화

  • SetActorLocation: 단순히 변수 값만 변경하는 것이 아니라 SetActorLocation 함수를 호출하여 계산된 좌표를 엔진에 실제로 반영해야 움직임이 구현된다.
  • 스냅 처리: 경계면 도달 시 부호 반전(*MoveSpeed = -1.0f)과 함께 위치를 경계값에 강제로 맞추는 스냅 처리를 수행하여 끼임 현상을 방지했다.
  • 재빌드 및 재배치: 클래스 구조 변경 시 라이브 코딩 대신 에디터를 끄고 Rebuild 하는 것이 안전하며, 변경된 생성자 로직 반영을 위해 기존 액터를 삭제 후 다시 배치했다.

 

🟧 2. GameMode - 게임의 컨트롤 타워 (2-1)


🟦 GameMode의 책임

게임의 규칙, 승패 조건, 스폰할 캐릭터 등을 총괄 관리하는 클래스다. 프로젝트 전역 설정과 레벨 별 설정으로 나뉘며, 충돌 시 World Settings의 레벨 별 설정이 우선권을 가짐을 학습했다.

🟦 블루프린트 확장

C++로 만든 SpartaGameMode를 블루프린트로 한 번 더 감싸 BP_SpartaGameMode로 운용하면, 에디터에서 Default Pawn ClassHUD Class 등을 직관적으로 변경할 수 있어 편리하다.

 

🟧 3. Pawn과 Character 클래스 설계


🟦 클래스 선택 기준

  • Pawn: 조종 가능한 기본 단위이지만 이동 로직이 비어있어 비행기나 드론 같은 특수 로직 구현에 적합하다.
  • Character: CharacterMovementComponent를 포함하고 있어 보행, 점프, 중력 등 인간형 캐릭터의 필수 기능을 즉시 사용할 수 있다.

🟦 스켈레탈 메시 설정

캐릭터의 뼈대와 외형을 담당하는 SkeletalMeshComponent를 설정했다. 전방 방향을 X축으로 맞추기 위해 Yaw 값을 -90도로 조정하고, 발이 CapsuleComponent 바닥에 닿도록 위치를 보정했다.

 

🟧 4. 3인칭 카메라 시스템 및 캐릭터 스폰


캐릭터의 뒤쪽 시점(3인칭)을 확보하기 위해 계층 구조를 설계하고 SpringArmCamera를 코드로 부착했다.

🟦 카메라 시스템 컴포넌트 구성

  • USpringArmComponent(스프링 암): 카메라 붐 역할을 하며, 캐릭터와 카메라 사이의 거리를 유지한다. 특히 bUsePawnControlRotation = true 설정을 통해 플레이어의 마우스 이동(컨트롤러 회전)에 따라 카메라가 캐릭터 주위를 회전하게 만든다.
  • UCameraComponent(카메라 컴포넌트): 실제 플레이어의 눈이 되는 컴포넌트다. 스프링 암의 끝점(SocketName)에 부착되어 암의 회전을 그대로 따르도록 설계했다.
  • SetupAttachment(셋업 어태치먼트): 컴포넌트 간의 부모-자식 관계를 설정한다. Root(Capsule) -> SpringArm -> Camera 순서로 연결하여 캐릭터가 이동할 때 카메라 시스템이 함께 따라오도록 구성했다.
ASpartaCharacter::ASpartaCharacter()
{
    PrimaryActorTick.bCanEverTick = false;

    // 스프링 암 생성: 캐릭터와 카메라 사이의 지지대 역할
    SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
    SpringArmComp->SetupAttachment(RootComponent); // 루트(캡슐)에 부착
    SpringArmComp->TargetArmLength = 300.0f;       // 카메라와 거리 설정
    SpringArmComp->bUsePawnControlRotation = true; // 마우스 회전에 따라 암이 회전

    // 카메라 생성: 실제 화면 렌더링 담당
    CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
    // 스프링 암의 끝부분(Socket)에 카메라 부착
    CameraComp->SetupAttachment(SpringArmComp, USpringArmComponent::SocketName);
    CameraComp->bUsePawnControlRotation = false;   // 암이 회전하므로 카메라는 고정
}

🟦 DefaultPawnClass(기본 폰 클래스) 설정

GameMode는 게임 시작 시 어떤 캐릭터를 생성할지 결정한다. 생성자에서 우리가 만든 SpartaCharacter의 클래스 정보를 등록하여, 플레이어가 시작 지점에서 해당 캐릭터로 스폰되도록 처리했다.

ASpartaGameMode::ASpartaGameMode()
{
    // 게임 시작 시 SpartaCharacter를 자동으로 스폰하도록 클래스 지정
    DefaultPawnClass = ASpartaCharacter::StaticClass();
}

 

 

🟫 오늘 느낀 점

이동 로직의 세세한 트러블슈팅을 거치며 언리얼의 Movable 설정과 스냅 처리의 중요성을 깊이 체감했다. 인간형 캐릭터를 위해 설계된 Character 클래스의 강력한 기본 기능과 카메라 시스템의 계층 구조를 이해하게 되어 뿌듯함을 느꼈다.

'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글

TIL - 34일차  (0) 2026.01.15
TIL - 33일차  (0) 2026.01.14
TIL - 31일차  (1) 2026.01.12
TIL - 30일차  (0) 2026.01.09
TIL - 29일차  (2) 2026.01.08