728x90
반응형

이번엔 표준라이브러리 사용이 아닌 언리얼에서 간단한 c++프린트를 생성하여 코딩해보겠습니다.

구현 기능은 다음과 같습니다.

 

새로운 엑터를 생성하고 엑터가 spawn 되는 시점에 동작되도록 아래 요구사항대로 동작하도록 코드를 구현 합니다

시작점(0,0) 있는 게임 캐릭터가 랜덤하게 10회 이동 합니다. 각 스텝에서 거쳐간 좌표를 모두 출력하는게 목적입니다.

세부 요구사항은 아래와 같습니다.

  • 시작점은 (0,0)이고 한번 이동시 x좌표와 y좌표 모두 2이상 이동할 수 없습니다. 예를 들면 아래와 같습니다.
    • (0,0) 에서 (1,2)은 이동할수 없습니다. y좌표가 2이상 이동했기 때문입니다.
    • (0,0)에서 (1,1)은 이동할 수 있습니다. x좌표 y좌표 모두 2미만 이동했기 때문 입니다.
  • 이동은 입력을 받는게 아니고 10회 모두 랜덤으로 움직입니다.
  • 매번 이동시 현재 좌표를 출력할 수 있어야 합니다.
  • 로그 출력은 UE_LOG를 활용합니다.
  • step 함수는 x좌표 y좌표 각각 이동할 거리 입니다.
    • 예를들어서 현재 좌표가(x1,y1)이라면 다음 좌표는 (x1+step 함수의 리턴값,y1 + step함수의 리턴 값) 입니다.
    • step함수는 0혹은 1을 랜덤으로 반환 합니다.
  • move함수는 (0,0)부터 10회 움직이면서 좌표를 출력합니다. 이동시 step 함수가 활용 됩니다.
  • 10회 이동시 각 스텝마다 이전 좌표기준 이동 거리를 계산해서 출력 합니다. 이동 거리는 아래와 같이 계산 합니다.
  • 10회 이동시 각 스텝마다, 50% 확률로 랜덤하게 이벤트가 발생합니다.(발생 시키는 부분도 구현하셔야 합니다.) 각 스텝마다 이벤트 발생여부를 출력합니다.
  • 10회 이동후에는 총 이동거리와 총 이벤트 발생횟수를 출력 합니다.

이를 구현한다면 아래와 같은 클래스가 될 것 입니다.(꼭 따라하실 필요는 없고 참고만 하세요)

구현 코드는 다음과 같습니다.

#include "MyActor.h"
#include "Math/UnrealMathUtility.h"   
AMyActor::AMyActor()
{
   

    // 초기화
    start = FVector2D(0, 0);
    evCnt = 0;               // 이벤트 발생 횟수
    totDist = 0;             // 총 이동 거리
}

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

    move();

    UE_LOG(LogTemp, Warning, TEXT("총 이동 거리: %d"), totDist);
    UE_LOG(LogTemp, Warning, TEXT("총 이벤트 발생 횟수: %d"), evCnt);
}

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

float AMyActor::distance(FVector2D first, FVector2D second)
{
    return FVector2D::Distance(first, second);
}

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

void AMyActor::move()
{
    FVector2D CurrentPosition = start;


    for (int i = 0; i < 10; ++i)
    {
        int32 StepX = step();
        int32 StepY = step();

        FVector2D NewPosition = CurrentPosition + FVector2D(StepX, StepY);

        // 이동 거리 계산
        float Dist = distance(CurrentPosition, NewPosition);
        totDist += Dist; // 총 이동 거리 누적

        // 이벤트 발생 여부
        int32 EventOccurred = createEvent();
        if (EventOccurred)
        {
            evCnt++;
        }

        UE_LOG(LogTemp, Warning, TEXT("Step %d: Current Position: (%f, %f), Distance: %f"),
            i + 1, NewPosition.X, NewPosition.Y, Dist);

        CurrentPosition = NewPosition;
    }
}

솔루션 파일은 이렇게 구현하였으며 다음으로 헤더 파일입니다.

 

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class HELLO_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;


private:
	// 이벤트 카운트
	int32 evCnt;
	// 총 이동 거리
	int totDist;
	// 시작 좌표
	FVector2D start;
	// 0 또는 1을 랜덤 반환
	int32 step();
	// 이동 함수
	void move();
	// 이벤트 생성
	int32 createEvent();
	//거리
	float distance(FVector2D first, FVector2D second);

};

 

private 에 필요한 변수와 함수를 생성해줬습니다.

 

이때 코드에는 문제가 없어도 언리얼 엔진 최신버전을 사용하고 계시다면 정말 많은 에러가 발생하는 경우가 있습니다.

빌드는 성공할 순 있으나 보기 불편하신 분들을 위해 적자면

c디스크 - program files - epic games - UE_(사용버전) - engine 폴더를 우클릭 후 속성을 선택 후 일반으로 들어가 읽기전용을 체크해제 후 적용해주시면 오류가 대부분 해결됩니다.

728x90
반응형