포스트

TIL 2026-03-19

TIL 2026-03-19

3/19 - Unreal C++ - Actor 랜덤 이동/회전 구현 정리

생성일: 2026년 3월 19일 오후 4:30

Unreal C++ — Actor 랜덤 이동/회전 구현 정리

오늘 구현한 기능 요약

  • 필수 : Actor가 랜덤 거리/각도로 10회 이동·회전, 매 스텝 현재 좌표를 AddOnScreenDebugMessage로 출력
  • 필수 : BeginPlay / Tick 기본 메서드 활용
  • 도전 : FMath::VInterpTo / FMath::RInterpTo 를 이용한 Lerp 부드러운 이동
  • 도전 : FMath::FRand()50% 확률 이벤트 시스템 (TriggerEvent 함수 분리)
  • 도전 : 10회 완료 후 총 이동 거리 + 이벤트 발생 횟수 최종 리포트 출력

핵심 언리얼 메서드 정리

메서드역할비고
BeginPlay()게임 시작 시 1회 실행초기 위치 설정, 루틴 시작
Tick(float DeltaTime)매 프레임 실행Lerp 보간 처리 위치
SetActorLocation(FVector)Actor 위치를 즉시 설정월드 좌표 기준
SetActorRotation(FRotator)Actor 회전을 즉시 설정Yaw(Z축) 기준
GetActorLocation()현재 위치 반환FVector 타입
GetActorRotation()현재 회전 반환FRotator 타입
GetActorForwardVector()액터 전방 방향 벡터 반환이동 방향 계산에 사용
GEngine->AddOnScreenDebugMessage(...)화면에 디버그 텍스트 출력Key, 시간, 색, 메시지 인자

핵심 FMath 라이브러리 정리

함수역할예시
FMath::RandRange(A, B)A~B 사이 랜덤 값 반환RandRange(50.f, 200.f)
FMath::FRand()0.0 ~ 1.0 사이 랜덤 floatFRand() < 0.5f → 50% 확률
FMath::VInterpTo(Current, Target, DeltaTime, Speed)벡터(위치)를 부드럽게 보간Lerp 이동
FMath::RInterpTo(Current, Target, DeltaTime, Speed)회전값을 부드럽게 보간Lerp 회전
FVector::Dist(A, B)두 벡터 사이 거리 계산총 이동 거리 누적
FRotator::NormalizeAxis(Yaw)각도를 -180~180 범위로 정규화Yaw 누적 시 오버플로 방지

언리얼 C++ — 일반 C++과 다른 점

  • 타입 시스템이 다르다
    • float, int 대신 언리얼 전용 타입 사용
      • 위치 → FVector(X, Y, Z)
      • 회전 → FRotator(Pitch, Yaw, Roll)
      • 문자열 → FString (일반 std::string 사용 불가)
      • 배열 → TArray<T> (일반 std::vector 대신)
  • TEXT() 매크로를 항상 감싸야 한다
    • 유니코드 호환을 위해 문자열 리터럴은 반드시 TEXT("...") 로 감쌈
    • FString::Printf(TEXT("[Step %d] ..."), Step)
  • GEngine->AddOnScreenDebugMessage 로 디버그 출력
    • 일반 C++ 의 std::cout 대신 언리얼 화면 출력 API 사용
    • UE_LOG(LogTemp, Log, TEXT("...")) 는 Output Log 창 출력
  • 클래스 이름 앞에 접두사가 붙는다
    • A → Actor 기반 클래스 (예: Aassignment_5)
    • U → UObject 기반 클래스
    • F → 일반 구조체 (예: FVector, FRotator)
  • UFUNCTION, UPROPERTY 매크로
    • 블루프린트 노출, 리플렉션, 직렬화 등을 위해 선언 위에 추가
    • UFUNCTION(BlueprintCallable) → 블루프린트에서 함수 호출 가능
    • UPROPERTY(EditAnywhere) → 에디터 Details 패널에서 값 편집 가능

구현 구조 (메서드 분리)

  • RunRandomMoveAndTurn() — 웨이포인트 사전 계산, 보간 시작
  • Move(float Distance) — 전방 방향으로 즉시 이동
  • Turn(float Angle) — Yaw 즉시 회전
  • LogCurrentLocation(int32 Step) — 현재 좌표 화면 출력
  • TriggerEvent(int32 Step) — 50% 확률 이벤트 처리
  • PrintFinalReport() — 총 이동 거리 + 이벤트 횟수 출력
  • Tick() — 매 프레임 Lerp 보간 처리, 웨이포인트 도달 판정

유의점

  • 즉시 이동 vs Lerp 이동 구조 차이
    • 즉시 이동: for 루프 안에서 바로 SetActorLocation 호출 → 순간 텔레포트
    • Lerp 이동: 웨이포인트를 미리 계산해 배열에 저장 → Tick에서 매 프레임 보간
    • Tick은 게임 루프의 핵심이므로, 반복 이동 로직은 Tick 안에서 처리해야 시각적으로 보임
  • DeltaTime을 반드시 Lerp에 넣어야 한다
    • VInterpTo(..., DeltaTime, Speed) 에서 DeltaTime 을 빠뜨리면 프레임레이트에 따라 속도가 달라짐
    • 프레임레이트 독립(Frame-rate independent) 이동을 위한 필수 인자
  • 웨이포인트 도달 판정 임계값
    • FVector::Dist(NewLoc, TargetLoc) < 1.f — 1cm 이내면 도착으로 판정
    • 값이 너무 작으면 영원히 도착 못 할 수 있고, 너무 크면 부정확하게 스킵됨
  • Yaw 누적 시 NormalizeAxis 필수
    • Yaw를 단순 누적하면 360 이상/이하로 넘어가 예기치 않은 동작 발생
    • FRotator::NormalizeAxis(Yaw) 로 -180~180 범위 유지
  • GEngine 널 체크
    • GEngine->AddOnScreenDebugMessage 호출 전 GEngine이 유효한지 확인하는 것이 안전
    • 빌드 설정이나 서버 모드에서 GEngine이 null일 수 있음

최종 코드

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.