UE 通用小功能代碼集合《一》

本文章由cartzhang編寫,轉載請註明出處。 所有權利保留。
文章鏈接: http://blog.csdn.net/cartzhang/article/details/78867455
作者:cartzhang

記錄一些,幾乎沒人都會用到一些小的功能。
以後還會有一些吧,所以先寫個《一》,也有很長時間沒有管理和更新了。

1. 打印到屏幕

FString DebugString;
            DebugString += "sockte name is ......";
            DebugString += SocketItem.WindowSocketList[0].SocketName;
            if (GEngine)
            {
                GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, DebugString);
            }

2. Set Timer. 定時器

設置Timer,帶循環的調用:CZ_SETTIMER_LOOP
設置Timer,不帶循環的調用:CZ_SETTIMER_UNLOOP
清理Timer:CZ_CLEARTIMER
檢測Timer是否激活:CZ_ISTIMERACTIVE

/************************************************************************/
/*  Set Timer by handle.                                                */
/************************************************************************/
#define CZ_SETTIMER_LOOP(handle, param1, param2) CZ_SETTIMER(handle, param1, param2, true)
#define CZ_SETTIMER_UNLOOP(handle, param1, param2) CZ_SETTIMER(handle, param1, param2, false)
#define CZ_SETTIMER(handle, param1, param2, param3)\
if (!GetWorldTimerManager().IsTimerActive(handle) && (param2) >= 0.0f)\
{\
    GetWorldTimerManager().SetTimer(handle, this, &param1, param2, param3); \
}
#define CZ_CLEARTIMER(handle) (GetWorldTimerManager().ClearTimer(handle))
#define CZ_ISTIMERACTIVE(handle) (GetWorldTimerManager().IsTimerActive(handle))

3. 單獨記錄,寫入文件的一個宏定義


/************************************************************************/
/* LOG to file                                                          */
/************************************************************************/
#define CZ_LOG_S(FileName,InputString) \
{ \
    static bool IsNewLog = true; \
    FString SaveDirectory = FPaths::ProjectSavedDir(); \
    SaveDirectory.Append("Logs/CZSave/"); \
    FString TmpFileName = FileName; \
    TmpFileName.Append(".log"); \
    \
    /** CreateDirectoryTree returns true if the destination directory existed prior to call or has been created during the call.*/ \
    IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); \
    CA_CONSTANT_IF(!PlatformFile.DirectoryExists(*SaveDirectory)) \
        PlatformFile.CreateDirectoryTree(*SaveDirectory); \
    \
        /** Get absolute file path*/ \
        FString AbsoluteFilePath = SaveDirectory + "/" + TmpFileName; \
        FFileHelper::EEncodingOptions EncodingOptions = FFileHelper::EEncodingOptions::AutoDetect; \
        IFileManager* FileManager = &IFileManager::Get(); \
        uint32 WriteFlags = (uint32)(EFileWrite::FILEWRITE_Append); \
        /** if file already exist,change name and save  it.*/ \
        CA_CONSTANT_IF(PlatformFile.FileExists(*AbsoluteFilePath) && IsNewLog) \
        { \
            IsNewLog = false; \
            FString AbsoluteDestinationPath = SaveDirectory + "/" + FDateTime::Now().ToString() + "-" + TmpFileName; \
            PlatformFile.MoveFile(*AbsoluteDestinationPath, *AbsoluteFilePath); \
            PlatformFile.DeleteFile(*AbsoluteFilePath); \
        } \
        { \
            FString TextToSave = FDateTime::Now().ToString(); \
            TextToSave.Append("-"); \
            TextToSave.Append(InputString); \
            TextToSave.Append("\r\n"); \
            FFileHelper::SaveStringToFile(TextToSave, *AbsoluteFilePath, EncodingOptions, FileManager, WriteFlags); \
        } \
    \
}
//
static FORCEINLINE void CZ_LOG(FString FileName, const TCHAR* Format, ...)
{
#if UE_BUILD_DEBUG || UE_EDITOR || WITH_EDITOR  
    TCHAR TempStr[1024];
    va_list Ptr;
    va_start(Ptr, Format);
    FCString::GetVarArgs(TempStr, ARRAY_COUNT(TempStr), ARRAY_COUNT(TempStr) - 1, Format, Ptr);
    va_end(Ptr);

    CZ_LOG_S(FileName, FString(TempStr));
#endif
}

這個用法距離,與UE的UE_LOG一模一樣的。

舉例:

    PW_LOG_S("CZLog", "Hello Marco");
    PW_LOG("CZLog", TEXT(" MACRO this is just call string no format"));
    PW_LOG("CZLog", TEXT("current health %f, character name is : %s"), Health, *GetFName().ToString());

文件會存在Ue的Saved/Logs下面。
這個好處是可以通過一個來屏蔽所有輸出和Log,並且到單獨某個文件中,方便各種查閱。

4. ….

暫時這樣。
多謝瀏覽,謝謝理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章