1. 커스텀 로그 카테고리 만들기
- 로그 카테고리는 CoreGloblals.h에 정의되어 있으며,
- 우리가 출력 로그를 볼때 필터를 통해 원하는 로그만 체크해서 확인할 수도 있다.


- 우리가 원하는 이름으로 로그 카테고리를 만드려면, 먼저 우리의 프로젝트 파일명으로 생성된 파일(모듈 파일)로 가야한다.(아래 예시의 경우 SCC_CH2_5)
- 헤더파일의 경우 (SCC_CH2_5.h) 아래 매크로를 사용하여 아래처럼 지정해주면 된다.
- 첫번째 인자는 원하는 로그 이름
- 두번째는 DefaultVerbosity
- 세번째는 CompileTimeVerbosity
//모듈. h
#pragma once
#include "CoreMinimal.h"
DECLARE_LOG_CATEGORY_EXTERN(MyLogTest, Log, All);
- cpp 파일의 경우 선언한 것을 정의를 해주면 된다.
//모듈.cpp
#include "SCC_CH2_5.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, SCC_CH2_5, "SCC_CH2_5" );
DEFINE_LOG_CATEGORY(MyLogTest);
- 이 카테고리를 사용하려면, 모듈.h 파일을 include 한 후 사용하면 된다.
#include "SCC_CH2_5/SCC_CH2_5.h" //include 해주기
#include "LogTestActor.h"
// Sets default values
ALogTestActor::ALogTestActor()
{
PrimaryActorTick.bCanEverTick = true;
}
void ALogTestActor::BeginPlay()
{
Super::BeginPlay();
UE_LOG(MyLogTest, Warning, TEXT("Custom Log Category Test"));
}
- 그 결과 아래처럼 필터에 내가 만든 커스텀 로그 카테고리가 뜨게 되며, 출력도 정상적으로 되는 것을 볼 수 있다.


2. 과제
https://github.com/GBL22M/SCC_CH2-5/tree/main/SCC_CH2_5/Source/SCC_CH2_5
SCC_CH2-5/SCC_CH2_5/Source/SCC_CH2_5 at main · GBL22M/SCC_CH2-5
Contribute to GBL22M/SCC_CH2-5 development by creating an account on GitHub.
github.com
- 코드: public 폴더의 MovingActor.h, private 폴더의 MovingActor.cpp
- 필수 기능 가이드 주요 구현
- Step 함수
- 0 또는 1의 랜덤한 값을 return 해주는 함수
- FMath::RandRange 사용
- Move 함수
- Step 함수의 값을 통해 Actor의 position을 움직여주고 UE_LOG를 통해 출력하는 함수
- Step 함수

//MovingActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MovingActor.generated.h"
UCLASS()
class SCC_CH2_5_API AMovingActor : public AActor
{
GENERATED_BODY()
public:
AMovingActor();
protected:
virtual void BeginPlay() override;
public:
void Move();
int32_t Step();
private:
FVector2D mStartPosition;
};
//MovingActor.cpp
#include "MovingActor.h"
AMovingActor::AMovingActor()
:mStartPosition({0,0})
{
PrimaryActorTick.bCanEverTick = true;
}
void AMovingActor::BeginPlay()
{
Super::BeginPlay();
for (int i = 0; i < 10; ++i)
{
Move();
}
}
void AMovingActor::Move()
{
int xStep = Step();
int yStep = Step();
mStartPosition.X += xStep;
mStartPosition.Y += yStep;
UE_LOG(LogTemp, Warning, TEXT("step (X: %d, Y: %d) | current position (X: %d , Y: %d)"),
xStep, yStep, (int)mStartPosition.X, (int)mStartPosition.Y);
}
int32_t AMovingActor::Step()
{
return FMath::RandRange(0, 1);
}
- 도전 기능 가이드 주요 구현
- Distance 함수
- FVector2D 두개를 받아서 두 위치 사이의 거리를 구해 리턴하는 함수
- CreateEvent 함수
- 50% 확률로 특정 이벤트를 발생하도록 하는 함수
- 해당 함수에서는 0 또는 1의 값을 리턴한 다음 main 로직에서 해당 값을 통해 이벤트가 발생했는지 여부를 확인하도록 구현했다.
- Distance 함수

//MovingActor.h
...
float Distance(FVector2D startPos, FVector2D endPos);
int CreateEvent();
private:
FVector2D mStartPosition;
int32_t mEventCount;
float mTotalDistance;
};
//MovingActor.cpp
#include "MovingActor.h"
AMovingActor::AMovingActor()
:mStartPosition({ 0,0 })
, mEventCount(0)
, mTotalDistance(0)
{
PrimaryActorTick.bCanEverTick = true;
}
void AMovingActor::BeginPlay()
{
Super::BeginPlay();
for (int i = 0; i < 10; ++i)
{
int eventFlag = CreateEvent();
Move(i);
if (eventFlag == 1)
{
UE_LOG(LogTemp, Log, TEXT("Event Occurs!"));
mEventCount++;
}
if (eventFlag == 0)
UE_LOG(LogTemp, Log, TEXT("Nothing Happened"));
}
UE_LOG(LogTemp, Log, TEXT("Total Distance : %f, Total Event Count: %d"), mTotalDistance, mEventCount);
}
void AMovingActor::Move(int stepIdx)
{
int xStep = Step();
int yStep = Step();
FVector2D beforeMove = mStartPosition;
mStartPosition.X += xStep;
mStartPosition.Y += yStep;
float stepDistance = Distance(beforeMove, mStartPosition);
UE_LOG(LogTemp, Log, TEXT("%d ) step (X: %d, Y: %d) | current position (X: %d , Y: %d)"),
stepIdx + 1, xStep, yStep, (int)mStartPosition.X, (int)mStartPosition.Y);
UE_LOG(LogTemp, Log, TEXT("move distance: %f"), stepDistance);
mTotalDistance += stepDistance;
}
int32_t AMovingActor::Step()
{
return FMath::RandRange(0, 1);
}
float AMovingActor::Distance(FVector2D startPos, FVector2D endPos)
{
float resultDistance = sqrt((startPos.X - endPos.X) * (startPos.X - endPos.X) + (startPos.Y - endPos.Y) * (startPos.Y - endPos.Y));
return resultDistance;
}
int AMovingActor::CreateEvent()
{
return FMath::RandRange(0, 1);
}

'Unreal Engine' 카테고리의 다른 글
| Unreal Property System (Reflection) (0) | 2025.01.13 |
|---|---|
| Unreal Engine Pointer Types (2) | 2025.01.09 |
| Unreal Engine 간단한 로그 찍기 (3) | 2025.01.06 |
| Unreal Engine 5 TIL day 5 (4) | 2024.12.20 |
| Unreal Engine 5 TIL day 4 (2) | 2024.12.19 |