Output Log
일반적으로 Output Log 창에 로그를 보고 경고나 에러를 확인한다
Toolbar > Window > Output Log를 클릭하면 위와 같은 창이 켜진다
UE_LOG
UE_LOG 함수를 통해 출력될 텍스트를 작성할 수 있다
UE_LOG의 인자로는 (로그 카테고리, 로그 수준, 형식 문자열, 인자)로 구분된다
- 로그카테고리:
로그의 분류를 위해 카테고리를 지정할 수 있고
Output Log 창에서 필터링이 가능하며,
Filters > Categories > Show all의 체크 해제 후 LogTemp만 체크하는 방식으로 이용 가능하다
- 로그 수준:
Output Log 창에서 로그 수준에 따라 색상이 달라진다
Log는 흰색, Warning은 노란색, Error는 빨간색이다
- 형식문자열:
출력할 문자열로 C언어의 printf() 함수의 인자 중 형식 문자열과 유사하다
- 인자: 형식문자열에 출력할 값이다
UE_LOG 사용 예시
// SGameInstance.cpp
...
void USGameInstance::Init()
{
Super::Init(); // 엔진 업데이트 루틴을 지키기 위해서, 현재 클래스의 바로 위 클래스가 먼저 실행되게 작성
UE_LOG(LogTemp, Log, TEXT("USGameInstance::Init() has been called."));
}
void USGameInstance::Shutdown()
{
Super::Shutdown();
UE_LOG(LogTemp, Log, TEXT("USGameInstance::Shutdown() has been called."));
}
UKismetSystemLibrary::PrintString()
서버나 콘솔에만 보이게끔 하는 용도로 가끔 사용하는 경우를 제외하고는
회사에서 UE_LOG()를 자주 사용하지 않는다
진짜 디버깅 용도로 개발 시에 자주 사용하는 함수는 UKismetSystemLibrary::PrintString()이다
다만 구현한 로직을 릴리즈 버전으로 배포할 때는 반드시 주석 처리를 해야 한다
UKismetSystemLibrary::PrintString() 사용 예시
첫 번째 인자인 "WorldContextObject"에서
GetWorld()를 통해서 진짜 World 개체를 넘겨줘도 되지만
this(USGameInstance 개체)를 전달해서 this가 속한 월드 개체를 알아서 유추하도록 넘겨줄 수도 있다
// SGameInstance.cpp
...
#include "Kismet/KismetSystemLibrary.h"
...
void USGameInstance::Init()
{
Super::Init();
UKismetSystemLibrary::PrintString(GetWorld(), TEXT("Init() has been called."));
}
...
check(조건식), checkf(조건식), ensure(조건식) 구문
- check
함수의 인자로 전달한 조건식이 거짓일 경우 check() 함수는 크래시를 발생시킨다
ex. check(nullptr != GameInstance)
- checkf
일반적으로 check를 통해 크래시만 발생시키기보다는
checkf() 함수를 활용해서 추가적인 디버깅 정보를 출력한다
ex. checkf(nullptr != GameInstance, TEXT(”Invalid GameInstance.”))
- ensure
실행 중에 크래시를 발생시키는 check와 checkf의 재빌드 시간이 부담이라면
ensure() 함수로 에러 메시지를 띄우기만 하고
다시 F5를 누르면 동작하게 된다
ex. ensure(nullptr != GameInstance)
- ensureMsgf
ensure을 이용해 그냥 에러 메시지를 띄우기보다는
ensureMsgf() 함수로 추가적인 디버깅 정보를 출력한다
ex. ensureMsgf(nullptr != GameInstance, TEXT(”Invalid GameInstance.”))
IsValid() 함수
런타임 중에 개체의 포인터가 유효한지 검사할 때 쓰는 함수이다
널포인터인지 아닌지만 검사하면 Pending Kill이나 GC의 대상인 경우를 확인할 수 없다
IsValid() 함수를 활용하면 위 세 가지를 모두 체크해 주고 문제없다면 true를 반환한다
예외처리와 checkf() 매크로 함수
반드시 예외가 있어서는 안 되는 조건문인 경우에
if 대신에 checkf() 혹은 ensureMsgf()를 이용하는 것이 좋다
// 예외처리가 되지 않는 if 조건문
if(IsValid(GetWorld()) == true)
{
UKismetSystemLibrary::PrintString(World, TEXT("Init() has been called."));
}
// checkf를 사용하는 것이 더 안전하고 좋은 코딩
checkf(IsValid(GetWorld()) == true, TEXT("InValid World."));
PRAGMA_DISABLE_OPTIMIZATION
Develpment Editor로 사용하는 경우
가끔씩 디버깅을 할 때 어떠한 값이 들어있는지 확인이 불가능한 경우가 발생한다
이러한 경우에는 해당 매크로를 원하는 부분 전과 후에 작성해 두면
이를 해결할 수 있다
PRAGMA_DISABLE_OPTIMIZATION
void USGameInstance::Init()
{
...
}
PRAGMA_DISABLE_OPTIMIZATION
단축키
Ctrl + T: 클래스 파일을 찾을 때 사용
Ctrl + Shift + F: 프로젝트 단위, 솔루션 단위, 해당 문서 단위를 골라서 소스코드를 검색 가능
속성 혹은 함수 우클릭 > Find All References 클릭: 해당 속성 혹은 함수가 어디서 사용되는지 볼 수 있다
'게임 엔진 > [코드조선] 언리얼' 카테고리의 다른 글
언리얼 오브젝트 기능 - 리플렉션 (0) | 2024.05.09 |
---|---|
언리얼 오브젝트 기능 - CDO (0) | 2024.05.09 |
언리얼 기초 - 언리얼 코딩 컨벤션 (0) | 2024.05.08 |
언리얼 기초 - 언리얼 오브젝트 클래스 (0) | 2024.05.08 |
언리얼 기초 - 언리얼 개발 환경 및 레벨 (0) | 2024.05.08 |