UE_LOGでプリントして値確認するのってめんどくさいよね

UE4でprintデバッグしてますか?
もちろん優秀なデバッガーがVisualStudioにしろXcodeにしろあるのでそちらを使うべきですが、printで値を確認したい時はあるはず。
ざっと書いて確認してすぐ消す。
そういった用途で使用するときはUE_LOGでやるには少しめんどくさいですよね(名前の通りLOGなのでそもそもprintデバッグするためのものではない)

簡単にprintデバッグできるように簡単なコードを書いてみました。 ほとんどFString::Printfのパクリですが。

Debug.h

class Debug
{
public:
    static void Print(const TCHAR* Text, ...);
};

#define print(text, ...) Debug::Print(TEXT(text), ## __VA_ARGS__)

Debug.cpp

void Debug::Print(const TCHAR* Text, ...)
{
    const static int32 LOG_BUFFER_SIZE    = 512;
    int32   BufferSize                  = LOG_BUFFER_SIZE;
    TCHAR   StartingBuffer[LOG_BUFFER_SIZE];
    TCHAR*  Buffer                      = StartingBuffer;
    int32   Result                      = -1;
    
    GET_VARARGS_RESULT( Buffer, BufferSize, BufferSize-1, Text, Text, Result );
    
    if( Result == -1 )
    {
        Buffer = nullptr;
        while(Result == -1)
        {
            BufferSize *= 2;
            Buffer = (TCHAR*) FMemory::Realloc( Buffer, BufferSize * sizeof(TCHAR) );
            GET_VARARGS_RESULT( Buffer, BufferSize, BufferSize-1, Text, Text, Result );
        };
    }
    
    Buffer[Result] = 0;
    
    GEngine->AddOnScreenDebugMessage(-1, 1.5, FColor::White,Buffer);
    UE_LOG(LogTemp, Log, TEXT("%s"), Buffer);
    
    if( BufferSize != LOG_BUFFER_SIZE )
    {
        FMemory::Free( Buffer );
    }
}

上のコードを使用した例とUE_LOGを使用した例を見比べてみましょう。

UE_LOGを使用した例

UE_LOG(LogTemp, Warning, TEXT("%d"), num);

上のコードを使用した例

print("%d", num);

だいぶすっきりしました!
これでprintデバッグがはかどりますね!