KoreanFoodie's Study

[언리얼] Helper Function - 로그 (Log) 1 : 콘솔에 출력하기 본문

Game Dev/Unreal C++ : Dev Log

[언리얼] Helper Function - 로그 (Log) 1 : 콘솔에 출력하기

GoldGiver 2022. 4. 19. 14:17

언리얼 로그 

언리얼은 UE_LOG 함수를 이용하여 로그를 출력한다.

먼저, .h 파일에 카테고리를 선언하고, 그에 맞는 정의를 .cpp 파일에서 Define 해주면 된다.

 

MyGame.h

//General Log
DECLARE_LOG_CATEGORY_EXTERN(LogMyGame, Log, All);

//Logging during game startup
DECLARE_LOG_CATEGORY_EXTERN(LogMyGameInit, Log, All);

 

MyGame.cpp

#include "MyGame.h"

//General Log
DEFINE_LOG_CATEGORY(LogMyGame);

//Logging during game startup
DEFINE_LOG_CATEGORY(LogMyGameInit);

 

헤더와 소스파일에 DECLARE / DEFINE 하는 것 대신, .cpp 파일에 아래 DEFINE_LOG_CATEGORY_STATIC 한줄만 넣어 주어도 된다.

// CategoryName : 생성하고자 하는 카테고리 명
// DefaultVerbosity : 로깅 수준
// CompileTimeVerbosity : 어느 상황에 로그를 출력할지

// 카테고리 이름, 경고 수준, 보여주는 범위
DEFINE_LOG_CATEGORY_STATIC(MyGameLog, Log, All);

흔히 verbosity 에서는 Warning 을 넣어 노란색으로 출력되도록 만든다.

간단한 예시를 보자.

 

CLog.cpp

DECLARE_LOG_CATEGORY_STATIC(BasicLog, Log, All);

#define CLOG_CALLINFO (FString(__FUNCTION__) + TEXT("(") + FString::FromInt(__LINE__) + TEXT(")"))
#define CLOG_S(Verbosity) UE_LOG(BasicLog, Verbosity, TEXT("%s"), *CLOG_CALLINFO)
#define CLOG(Verbosity, Format, ...) UE_LOG(BasicLog, Verbosity, TEXT("%s%s"), *CLOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))
#define CCHECK(Expr, ...) {if(!(Expr)) { CLOG(Error, TEXT("ASSERTION : %s"), TEXT("'"#Expr"'")); return __VA_ARGS__;}}

각각의 매크로에 대한 설명은 다음과 같다 :

  • CLOG_CALLINFO : 함수 이름과 코드 위치를 FString 으로 return 한다 (로그를 수행하지 않음)
  • CLOG_S : 인자로 전달된 경고 수준 (Verbosity) 으로, CLOG_CALLINFO 의 정보를 출력한다.
  • CLOG : CLOG_S 에 사용자가 전달하고 싶은 텍스트를 추가로 전달한다.
  • CCHECK : 인자가 null 일때 에러 메시지를 출력한다. 추가적으로 인자를 리턴할 수 있다.

 

실제 사용 예시는 다음과 같다.

CLOG_S(Warning);
CLOG(Warning, TEXT("Log this : %s"), TEXT("Hello"));
CCHECK(nullptr, false); // 에러 로그를 출력하며, 현재 함수의 리턴값으로 false 를 전달

 

더 간단하게는, 매크로를 쓰지 않고 다음과 같이 사용할 수도 있다.

UE_LOG(LogTemp, Warning, TEXT("EquipWeapon is Called!"));

LogTemp 카테고리를 써 주면 된다!

 

참/거짓 체크

자매품으로, True/False 값을 간단하게 체크하는 매크로도 사용해 보자

 

Define.h

#define CheckNull(p){ if(p == NULL) return; }
#define CheckNullResult(p, result){ if(p == NULL) return result; }

#define CheckTrue(p){ if(p == true) return; }
#define CheckTrueResult(p, result){ if(p == true) return result; }

#define CheckFalse(p){ if(p == false) return; }
#define CheckFalseResult(p, result){ if(p == false) return result; }

 

언리얼에는 여러 매크로가 정의되어 있는데, '에디터'에서만 사용하고, 실제 쉬핑 빌드에서는 사용하고 싶지 않다... 면 다음과 같은 매크로를 활용하자! 😄

#if WITH_EDITOR
    CLOG(Warning, TEXT("This is editor only debug log"));
#endif

 

Comments