언리얼 엔진

Unreal Engine - 랜덤 이동과 이벤트 처리 설계

로안님 2025. 1. 8. 22:26

개요

이 블로그에서는 언리얼 엔진의 AMyActor 클래스를 기반으로, 랜덤 이동, 거리 계산, 이벤트 발생의 기본적인 로직을 구현하는 방법을 단계별로 설명합니다.


1. 랜덤 이동 구현 (Step 함수)

Step() 함수는 FMath::RandRange(0, 1)을 사용하여 0 또는 1의 랜덤 값을 반환합니다. 이 값은 이동 방향 또는 이동 크기를 결정하는 데 사용됩니다.

구현 코드:

 
int32 AMyActor::Step() {
    return FMath::RandRange(0, 1); // 0 또는 1 반환
}

2. 이동 로직 (Move 함수)

Move() 함수는 다음을 수행합니다:

  1. 10번 반복하며 랜덤 이동을 처리합니다.
  2. 각 반복에서:
    • 이전 좌표를 저장하고,
    • 새로운 좌표를 계산합니다.
    • 이동 거리를 누적하고,
    • 이벤트 발생 여부를 확인합니다.

구현 코드:

void AMyActor::Move() {
    for (int32 i = 1; i < 11; i++) {
        FVector2D Previous = Start;
        Start.X += Step();
        Start.Y += Step();

        totDist += distance(Previous, Start);

        UE_LOG(LogTemp, Warning, TEXT("Step %d: Position = (%.0f, %.0f)"), i, Start.X, Start.Y);

        if (createEvent()) {
            UE_LOG(LogTemp, Warning, TEXT("Event triggered!"));
            evCnt++;
        } else {
            UE_LOG(LogTemp, Warning, TEXT("No event."));
        }
    }
    UE_LOG(LogTemp, Warning, TEXT("Total Distance: %.1f, Event Count: %d"), totDist, evCnt);
}

3. 이동 거리 계산

distance 함수는 두 점 사이의 거리를 계산하는 함수입니다. 피타고라스의 정리를 사용하며, FMath::Sqrt를 활용합니다.

구현 코드:

float AMyActor::distance(FVector2D first, FVector2D second) {
    float XDiff = first.X - second.X;
    float YDiff = first.Y - second.Y;
    return FMath::Sqrt((XDiff * XDiff) + (YDiff * YDiff));
}

4. 이벤트 발생 여부 확인

createEvent() 함수는 50% 확률로 이벤트를 발생시키는 간단한 함수입니다. 언리얼 엔진의 FMath::RandRange를 활용하여 0과 1 사이의 랜덤 값을 생성합니다.

구현 코드:

bool AMyActor::createEvent() {
    return FMath::RandRange(0, 1) == 0;
}

참고: 위 코드는 단일 반환식으로 간결하게 작성되어 있으며, if-else 블록을 사용하지 않아도 됩니다.

bool AMyActor::createEvent() {
	int32 randomNum = FMath::RandRange(0, 1);
	if (randomNum == 0) {
		return true;
	}
	else {
		return false;
	}
}

5. 누적 데이터 출력

반복문이 끝난 후, 총 이동 거리와 이벤트 발생 횟수를 출력합니다. UE_LOG는 언리얼 엔진에서 디버깅 로그를 출력하는 표준 함수로, 개발 중 로직 검증에 유용합니다.


전체 코드

#include "MyActor.h"

// Sets default values
AMyActor::AMyActor() {
    PrimaryActorTick.bCanEverTick = true;
    Start = FVector2D(0, 0);
    evCnt = 0;
    totDist = 0.0f;
}

void AMyActor::BeginPlay() {
    Super::BeginPlay();
    Move();
}

void AMyActor::Tick(float DeltaTime) {
    Super::Tick(DeltaTime);
}

void AMyActor::Move() {
    for (int32 i = 1; i < 11; i++) {
        FVector2D Previous = Start;
        Start.X += Step();
        Start.Y += Step();

        totDist += distance(Previous, Start);

        if (createEvent()) {
            evCnt++;
        }
    }
}

int32 AMyActor::Step() {
    return FMath::RandRange(0, 1);
}

float AMyActor::distance(FVector2D first, FVector2D second) {
    float XDiff = first.X - second.X;
    float YDiff = first.Y - second.Y;
    return FMath::Sqrt((XDiff * XDiff) + (YDiff * YDiff));
}

bool AMyActor::createEvent() {
    return FMath::RandRange(0, 1) == 0;
}

결론

이 코드는 언리얼 엔진에서 간단한 랜덤 이동과 이벤트 처리의 기본 원리를 설명합니다. 주요 기능은 다음과 같습니다:

  1. 랜덤 이동누적 거리 계산.
  2. 이벤트 발생 여부 확인.
  3. 디버깅을 위한 UE_LOG 활용.