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 사이 랜덤 float | FRand() < 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 창 출력
- 일반 C++ 의
- 클래스 이름 앞에 접두사가 붙는다
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 라이센스를 따릅니다.