ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unreal Engine] C++ : Log를 남기는 여러가지 방법
    Unreal Engine 5._ 2022. 12. 6. 11:10

    로그는 개발에 있어 가장 중요한 요소 중 하나입니다.

    프로그램의 실행이 내 뜻대로 되지 않을 때, 실행 중간 중간의 기록을 남겨야 하는 상황 등 로그의 중요성은 말로 다 할 수 없습니다.

     

    이번 글에서는 언리얼 엔진에서 로그를 출력하는 여러 방법에 대하여 살펴보도록 하겠습니다.

     


     

    1. UE_LOG

     

    더보기

    로그를 남기는 가장 간단한 방법입니다.

    UE_LOG({Log category}, {Log verbosity level}, {Log message});
    • Log category
      • 로그의 분류입니다. 기본적으로 LogTemp가 많이 사용됩니다.
    • Log level
      • 로그의 수준입니다. 다음의 7단계가 존재합니다.
      • Fatal, Error, Warning, Display, Log, Verbose, VeryVerbose
      • 로그의 수준에 따라 출력되는 로그의 색깔과, 콘솔 및 파일에서의 출력 여부가 달라집니다.
    • Log message
      • 로그에 표시할 메시지 입니다.

     

    위 설명을 토대로, 로그를 작성하는 코드를 다음과 같이 사용할 수 있습니다.

    UE_LOG(LogTemp, Log, TEXT("Log message"));
    // LogTemp: Log message

    위 코드는 실행되면 에디터의 Output Log에 주석과 같이 표시됩니다.

     

    C스타일의 입력도 가능합니다.

    int32 some_value = 10;
    UE_LOG(LogTemp, Log, TEXT("Log : %d"), some_value);
    // LogTemp: Log : 10

     

    2. UE_LOG : Log category

     

    더보기

    Log category는 그 종류가 굉장히 많습니다.

    우선, 언리얼 엔진에서 기본적으로 제공하는 Log category가 정리된 글을 발견하여 공유합니다.

    List of all Unreal Engine Log categories

    대부분의 상황에 대응이 가능할 정도로 많은 카테고리를 제공합니다.

    하지만 기본 제공되는 카테고리 외에, 추가적인 카테고리를 정의할 수 있습니다.

     

    언리얼 프로젝트를 C++로 생성하면 프로젝트 소스 최상위 폴더에 {Project name}을 파일명으로 하는 .cpp및 .h파일이 존재합니다.

    그 파일에 각각 아래 코드를 추가하는 것으로 카테고리를 추가할 수 있습니다.

     

    {Project name}.h

    DEFINE_LOG_CATEGORY(LogCustom);

    {Project name}.cpp

    DECLARE_LOG_CATEGORY_EXTERN(LogCustom, Log, All);

    위 코드의 경우, LogCustom이라는 카테고리가 추가됩니다.

     

    3. UEngine::AddOnScreenDebugMessage

     

    더보기

    UE_LOG는 콘솔과 로그 파일에 로그가 출력된다는 특징이 있습니다.

    이번 문단에서는 플레이 화면에 출력할 수 있는 로그 기능을 소개하려 합니다.

    UEngine::AddOnScreenDebugMessage는 언리얼 엔진 공식 문서에 해당 함수에 대한 서명이 있습니다.

    AddOnScreenDebugMessage | Unreal Engine Documentation

     

    이 함수의 서명은 다음과 같습니다.

    AddOnScreenDebugMessage(
        uint64 key,
        float TimeToDisplay,
        FColor DisplayColor,
        const FString& DebugMessage,
        bool bNewerOnTop = true,
        const FVector2D& TextScale = UE::Math::TVector2::UnitVector
    )
    • uint64 key
      • 로그의 Key입니다. -1인 경우와, 그 외의 경우에 작동하는 방식이 다릅니다.
      • -1인 경우 기존의 로그 위에 출력됩니다. (파라미터가 uint64지만, -1값은 별도로 작동합니다.)
      • 그 외의 경우 동일한 Key값을 가진 로그를 모두 제거하고 로그를 출력합니다.
    • float TimeToDisplay
      • 로그를 출력할 시간입니다. (단위는 Second입니다.)
    • FColor DisplayColor
      • 출력될 로그의 색상입니다. FColor에 이미 등록된 색깔 혹은 생성자를 통해 색을 정의할 수 있습니다.
    • const FString& DebugMessage
      • 로그에 출력될 메시지 입니다.
    • bool bNewerOnTop
      • 새로 생성된 로그가 상단에 위치할지의 여부입니다. 기본값은 true입니다.
      • 해당 파라미터는 key가 INDEX_NONE = -1 인 경우에만 작동합니다.
    • const FVector2D& TextScale = UE::Math::TVector2::UnitVector
      • 메시지의 크기를 의미합니다.
      • 기본값은 1을 의미합니다.

     

    위 함수의 서명에 따라, 로그를 작성하는 예시는 다음과 같습니다.

    GEngine->AddOnScreenDebugMessage(
        -1,
        3.0f,
        FColor::White,
        TEXT("Message")
    );

    GEngine은 UEngine*형의 전역 변수입니다.

    위와 같은 코드가 실행될 경우, 스크린에 3초동안 흰색의 Message가 출력됩니다.

    key가 -1이기 때문에 코드가 호출될 때 마다 Message가 쌓이면서 출력될 것 입니다.

    만약 key가 다른 정수일 경우, 기존의 같은 key를 가진 메시지는 모두 지워집니다.

     

    위 문단의 UE_LOG와 다르게, AddOnScreenDebugMessage에서 C스타일의 출력을 하는 방법은 조금 다릅니다.

    예제는 다음과 같습니다.

    int32 some_value = 10;
    GEngine->AddOnScreenDebugMessage(
        -1,
        3.0f,
        FColor::White,
        FString::Printf(TEXT("Message : %d"), some_value)
    );

    AddOnScreenDebugMessage의 5번째 파라미터는 bNewerOnTop이기 때문에, 다른 방식으로 접근해야 합니다.

    FString의 Printf함수로 래핑하면 C스타일의 출력이 가능합니다.

    위와 같은 코드는 Mesage : 10이라는 흰색 메시지를 출력할 것 입니다.

     


     

    언리얼 엔진에서 로그를 출력하는 기본적인 두 가지 방법을 살펴보았습니다.

    이 외에도 Blueprint나 UI를 이용해서 로그를 남기는 여러가지 방법이 있습니다.

    때와 상황에 맞게 적절한 방법을 선택해주세요

     

    이 글이 도움이 되셨기를 바랍니다.

    감사합니다.

    댓글

Designed by Tistory.