UnrealEngine/UE4 - CPP
[UE4-CPP] 커스텀 로그(LOG) 만들기
에드윈H
2021. 5. 7. 16:32
프로젝트명.h과 프로젝트명.CPP 에 커스텀 로그 카테고리를 설정
#pragma once
#include "CoreMinimal.h"
DECLARE_LOG_CATEGORY_EXTERN(BLOG_LOG, Log, All); //추가
#include "blogCPP.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, blogCPP, "blogCPP" );
DEFINE_LOG_CATEGORY(BLOG_LOG); //추가
프로젝트명.h 에 한개씩 추가.
1. 호출된 함수의 이름과 라인 매크로를 String화(Call Info) 시켜주는 매크로
#define LOG_CALLINFO (FString(__FUNCTION__) + TEXT("(") + FString::FromInt(__LINE__) + TEXT(")"))
LOG_CALLINFO(이하 콜정보)를 호출해주면 함수이름을 알수 있게 된다.
해당 콜 정보를 UE_LOG에서 string호출로 출력해보게 되면,
로그카테고리명: 클래스명::함수이름(호출된 라인수)
출력이 된다. 하지만 이렇게 사용하기엔 조금 아쉽다. 콜 정보를 좀 더 쉽게 호출해보자.
2. Call Info를 쉽게 호출해주는 로그만들기
#define LOG_S(Verbosity) UE_LOG(BLOG_LOG, Verbosity, TEXT("%s"), *LOG_CALLINFO)
해당 LOG_S를 호출하게되면, 로그 카테고리를 안써도되고, 로그 수준만 작성해주면 되어 간단하게 호출할수 있게 된다.
Warning을 넣어 노란색으로 출력되었다.
3. Call Info를 쉽게 호출해주는 로그에 원하는 텍스트 넣기
#define LOG(Verbosity, Format, ...) UE_LOG(BLOG_LOG, Verbosity, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))
원하는 Text도 출력되는것을 확인하였다.
그 외
4. Verbosity 인자 제외 후 매크로 화 시키기
#define LOG_WARNING(Format, ...) UE_LOG(BLOG_LOG, Warning, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))
#define LOG_ERROR(Format, ...) UE_LOG(BLOG_LOG, Error, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))
5. 기존 C/C++에서 Assert와 비슷한 용도 CHECK만들기
#define CHECK(Expr, ...) {if(!(Expr)) {LOG(Error, TEXT("ASSERTION : %s"), TEXT("'"#Expr"'")); return __VA_ARGS__;}}
tempbool이 true라면 아무런 출력도 발생하지 않지만, false라서 해당 tempbool에 대한 어설션로그를 찍어준다.
6. 출력로그 말고 게임스크린 간단하게에 찍기
#define LOG_SCREEN(Format, ...) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(Format, ##__VA_ARGS__))
요약
프로젝트.h
#pragma once
#include "CoreMinimal.h"
/*아래 전부 추가*/
DECLARE_LOG_CATEGORY_EXTERN(BLOG_LOG, Log, All);
//1. 호출된 함수의 이름과 라인 매크로를 String화 시킴
#define LOG_CALLINFO (FString(__FUNCTION__) + TEXT("(") + FString::FromInt(__LINE__) + TEXT(")"))
//2. 1번 CallInfo와 함께 아무 내용이 없는 로그를 찍는 매크로
#define LOG_S(Verbosity) UE_LOG(BLOG_LOG, Verbosity, TEXT("%s"), *LOG_CALLINFO)
//3. CallInfo와 함께 텍스트로 로그를 찍는 매크로
#define LOG(Verbosity, Format, ...) UE_LOG(BLOG_LOG, Verbosity, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))
//4. LOG에 Verbosity를 인자에서 빼고 매크로화 시킨것.
#define LOG_WARNING(Format, ...) UE_LOG(BLOG_LOG, Warning, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))
#define LOG_ERROR(Format, ...) UE_LOG(BLOG_LOG, Error, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))
//5. assert()와 거의 비슷한 용도로 사용가능한 매크로
#define CHECK(Expr, ...) {if(!(Expr)) {LOG(Error, TEXT("ASSERTION : %s"), TEXT("'"#Expr"'")); return __VA_ARGS__;}}
//6. 게임 플레이 스크린에다가 LOG를 직접 찍는 매크로
#define LOG_SCREEN(Format, ...) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(Format, ##__VA_ARGS__))
프로젝트.cpp
#include "blogCPP.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, blogCPP, "blogCPP" );
DEFINE_LOG_CATEGORY(BLOG_LOG); //추가
설명하면서 하다보니 이것저것 있는데 주로 많이 사용할건 CallInfo와 텍스트를 호출하는 LOG와 Assert기능인 CHECK 매크로를 자주 사용하지 않을까 싶다.
참고: developstudy.tistory.com/40