25.01.06 (월)

2025. 1. 6. 19:17·내배캠/TIL
목차
  1. 전체 로직
  2. 코드를 짜면서 새롭게 알게된 내용
  3. CodeCata

간단한 좌표 이동 프로그램을 Unreal의 Log시스템을 활용해서 표현하였다.

 

전체 로직

  1. 시작점은 (0, 0)이고 한 번 이동시, x좌표와 y좌표 모두 '2' 이상 이동할 수 없습니다.
  2. 이동은 입력을 받지 않고, 10회 모두 랜덤으로 움직입니다.
  3. 매번 이동시 현재 좌표를 출력합니다.
  4. 로그 출력은 UE_LOG를 활용합니다.
  5. Step 함수는 x좌표, y좌표 각각 이동할 거리를 계산합니다.
  6. Move 함수는 (0, 0) 시작 좌표부터 10회 움직이면서 좌표를 출력합니다. 이동 시 Step 함수를 활용합니다.
  7. 1회 움직일 때마다 이전 좌표 기준에서 이동한 거리를 계산해 같이 출력합니다.
  8. 1회 움직일 때마다 50% 확률로 랜덤하게 이벤트가 발생 여부를 출력합니다.
  9. 10회 이동이 모두 끝난 후 총 이동거리와 총 이벤트 발생 횟수를 출력합니다.

 

 

*전체 로직 반영한 코드

 

MoveActor.h

더보기
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

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

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

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

private:
	struct FStepValue
	{
		int X;
		int Y;
	};

	FStepValue StepValue;
	FVector2D StartLocation;
	TArray<FVector2D> PositionList;
	int32 EventCnt;
	bool bIsEvent;

	void Step();
	void Move();
	float GetDistance(const FVector2D& FirstLocation, const FVector2D& SecondLocation);
	bool CreateEvent();
};

MoveActor.cpp

더보기

 

// Fill out your copyright notice in the Description page of Project Settings.


#include "MoveActor.h"
#include "Math/UnrealMathUtility.h"

// Sets default values
AMoveActor::AMoveActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	StartLocation = { 0,0 };
	PositionList.Add(StartLocation);
	bIsEvent = false;
	EventCnt = 0;
}

// Called when the game starts or when spawned
void AMoveActor::BeginPlay()
{
	Super::BeginPlay();
	
	UE_LOG(LogTemp, Display, TEXT("StartLocation: (%1.f, %1.f)"), StartLocation.X, StartLocation.Y);

	Move();
}


// 이동할 수치 Struct에 저장 메서드
// 0~1 사이의 난수를 X와 Y 따로 Struct에 저장합니다.
void AMoveActor::Step()
{
	int MinValue = 0;
	int MaxValue = 1;

	StepValue.X = FMath::RandRange(MinValue, MaxValue);
	StepValue.Y = FMath::RandRange(MinValue, MaxValue);

}

// 이동 및 현재 위치 출력, 이벤트 발생여부 출력 메서드
// 1. Step 함수를 사용해서 이동한 좌표를 10회 저장합니다.
// 2. 1번 인덱스부터 순회하며 현재 위치와 전 위치에서 현재 위치로 이동한 거리를 출력합니다.
// 3. CreateEvent 함수를 통해 이벤트 발생여부를 확인한 후, 발생했다면 이벤트를 출력합니다.
// 4. 마지막으로 전체 이동거리와 총 이벤트 발생 횟수를 출력합니다.
void AMoveActor::Move()
{
	for (int i = 0; i < 10; i++)
	{
		Step();
		
		PositionList.Add({ PositionList[i].X + StepValue.X, PositionList[i].Y + StepValue.Y });
	}

	int ListSize = PositionList.Num();
	for (int i = 1; i < ListSize; i++)
	{
		float Distance = GetDistance(PositionList[i - 1], PositionList[i]);
		UE_LOG(LogTemp, Warning, TEXT("Current Location: (%1.f, %1.f), MoveDistance: %.1f"), PositionList[i].X, PositionList[i].Y, Distance);

		bIsEvent = CreateEvent();
		if (bIsEvent)
		{
			UE_LOG(LogTemp, Error, TEXT("Event was Triggered!"));
			bIsEvent = false;
			EventCnt++;
		}
	}

	float TotalMovedDistance = GetDistance(StartLocation, PositionList.Last());
	UE_LOG(LogTemp, Display, TEXT("Total Moved Distance: %.1f, Event Count: %d"), TotalMovedDistance, EventCnt);
}

// 두 위치 Vector의 거리를 계산하는 메서드
// 유클리드 거리 공식을 통해 두 Vector의 거리를 계산한 뒤 반환합니다.
float AMoveActor::GetDistance(const FVector2D& FirstLocation, const FVector2D& SecondLocation)
{
	float DeltaX = SecondLocation.X - FirstLocation.X;
	float DeltaY = SecondLocation.Y - FirstLocation.Y;

	return FMath::Sqrt((DeltaX * DeltaX) + (DeltaY * DeltaY));
}

// 50퍼센트 확률로 Event 발생 여부 반환 메서드
bool AMoveActor::CreateEvent()
{
	float Probability = FMath::FRand();
	if (Probability >= 0.5)
	{
		return true;
	}
	else
	{
		return false;
	}
}

 


 

코드를 짜면서 새롭게 알게된 내용

 

 

유클리드 거리 공식

float AMoveActor::GetDistance(const FVector2D& FirstLocation, const FVector2D& SecondLocation)
{
      float DeltaX = SecondLocation.X - FirstLocation.X;
      float DeltaY = SecondLocation.Y - FirstLocation.Y;

      return FMath::Sqrt((DeltaX * DeltaX) + (DeltaY * DeltaY));
}​

FVector2D의 Distance 함수를 사용하지 않고 유클리드 거리 공식을 활용해서 두 FVector2D 좌표의 거리를 계산해 출력하는 함수를 만들었다.

 

TArray
  • 언리얼 엔진에서 제공하는 동적 배열 클래스이다.
  • 크기가 가변적이며, 배열의 요소를 쉽게 추가, 삭제, 정렬, 검색할 수 있다.
  • C++의 std::vector와 유사하지만 언리얼 엔진에 최적화된 기능을 포함하고 있다.
  • 언리얼 엔진 내부의 메모리 관리 및 가비지 컬렌션과 호환된다.
  • 블루프린트에서도 사용할 수 있다.

    주요 메서드
    메서드 설명
    Add(Element) 배열에 요소를 추가
    AddUnique(Element) 중복되지 않은 요소만 추가
    Insert(Element, Index) 지정한 Index에 요소를 삽입
    Remove(Element) 배열에서 특정 요소 제거
    Remove(Index) 특정 Index에서 요소를 제거
    Empty( ) 배열의 모든 요소를 제거하지만 메모리는 유지
    Reset( )  배열을 초기화하고, 메모리도 해제
    IsValidIndex(Index) 해당 인덱스가 유효한지 확인
    Contains(Element) 배열에 해당 요소가 포함되어 있는지 확인
    Find(Element) 특정 요소의 인덱스를 반환(없으면 -1)
    Last( ) 배열의 마지막 요소를 반환
    Num( ) 배열의 현재 크기를 반환
    Sort( ) 기본 오름차순 정렬
    Sort(Predicate) 사용자 정의 조건으로 정렬
    Shrink( ) 배열의 크기를 실제 사용량에 맞게 줄임
    Reserve(Number) 지정된 크기만큼 메모리를 예약

    배열의 사이즈를 구하는 메서드가 size( ) 가 아닌 Num( )이었던 부분이랑 배열의 마지막 요소를 반환하는 것이 end( )가 아닌 Last( )인 것 등등, 기존에 std::vector와 비슷하면서도 다른 부분들이 있어서 정리해보았다.

 

 

 

 

 


 

CodeCata

 

금일 코드카타를 하던 중, priority_queue를 활용해서 해결할 만한 문제가 나와서 복습하며 내용을 정리해보았다.

 

https://dong-grae.tistory.com/91

 

priority_queue 우선순위 큐 활용

명예의 전당의 최하위 점수를 매일 기록해 반환하는 문제이다.즉 k가 3이라고 한다면 탑3를 매일 선정하고 그 중 최하위 점수를 answer 리스트에 저장해 반환하면 되는 문제인데 예시 경우에는 올

dong-grae.tistory.com

 

'내배캠 > TIL' 카테고리의 다른 글

25.01.08 (수)  (0) 2025.01.08
25.01.07 (화)  (0) 2025.01.07
25.01.03 (금)  (1) 2025.01.03
25.01.02 (목)  (1) 2025.01.02
24.12.31 (화)  (0) 2024.12.31
  1. 전체 로직
  2. 코드를 짜면서 새롭게 알게된 내용
  3. CodeCata
'내배캠/TIL' 카테고리의 다른 글
  • 25.01.08 (수)
  • 25.01.07 (화)
  • 25.01.03 (금)
  • 25.01.02 (목)
동그래님
동그래님
  • 동그래님
    개발자 동그래
    동그래님
  • 전체
    오늘
    어제
    • 분류 전체보기 (210)
      • 공부 (51)
        • Code Cata (50)
      • 내배캠 (151)
        • TIL (50)
        • C++ (37)
        • Unreal Engine (48)
        • GAS(Gameplay Ability System.. (16)
      • Project (7)
        • Gunfire Paragon (5)
        • Arena Fighters (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    동그래님
    25.01.06 (월)
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.