IT圈老男孩1 发表于 2022-5-11 09:47

UE 消息打印

参数均按顺序给出
1. GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT(" Hello "));

函数申明:
/***   This function will add a debug message to the onscreen message list.*   It will be displayed for FrameCount frames.*   @paramKeyA unique key to prevent the same message from being added multiple times.*   @paramTimeToDisplay   How long to display the message, in seconds.*   @paramDisplayColor    The color to display the text in.*   @paramDebugMessage    The message to display.*/void AddOnScreenDebugMessage(int32 Key, float TimeToDisplay, FColor DisplayColor, const FString& DebugMessage, bool bNewerOnTop = true, const FVector2D& TextScale = FVector2D::UnitVector);
此外,两个默认参数

bNewerOnTop(true):是否顶层显示,
TextScale(FVector2D::UnitVector):字体比例。
此外,RemoveOnScreenDebugMessage(Key) 可以根据具体的Key去除正在显示的消息。

此外,可以使用宏定义简化操作
#define PRINT(String) {if (GEngine){GEngine->AddOnScreenDebugMessage(-1,10.0f,FColor::Red,*(String));}}2. UKismetSystemLibrary::PrintString(this,TEXT(" Hello "));

函数申明:
/** * Prints a string to the log, and optionally, to the screen * If Print To Log is true, it will be visible in the Output Log window.Otherwise it will be logged only as 'Verbose', so it generally won't show up. * * @param   InString      The string to log out * @param   bPrintToScreenWhether or not to print the output to the screen * @param   bPrintToLog   Whether or not to print the output to the log * @param   bPrintToConsole Whether or not to print the output to the console * @param   TextColor       Whether or not to print the output to the console * @param   Duration      The display duration (if Print to Screen is True). Using negative number will result in loading the duration time from the config. */UFUNCTION(BlueprintCallable, meta=(WorldContext="WorldContextObject", CallableWithoutWorldContext, Keywords = "log print", AdvancedDisplay = "2", DevelopmentOnly), Category="Utilities|String")static void PrintString(const UObject* WorldContextObject, const FString& InString = FString(TEXT("Hello")), bool bPrintToScreen = true, bool bPrintToLog = true, FLinearColor TextColor = FLinearColor(0.0, 0.66, 1.0), float Duration = 2.f);
原注释不祥,给中文注释

const UObject* WorldContextObject:用于得到当前世界的上下文
const FString& InString:文本内容
bool bPrintToScreen:是否打印到屏幕
bool bPrintToLog:是否打印到Log
FLinearColor TextColor:文本颜色
float Duration:显示持续时间
此外,注意 #include "Kismet/KismetSystemLibrary.h"

此外,还有 PrintText() 函数用于打印 FText 类型的变量。

此外,可以看出,源代码的命名都十分规范,其含义一目了然。
3. UE_LOG(LogTemp, Log, TEXT(" Hello "));

宏定义 :
/*** Amacro that outputs a formatted message to log if a given logging category is active at a given verbosity level * @param CategoryName name of the logging category * @param Verbosity verbosity level to test against * @param Format format text **/#define UE_LOG(CategoryName, Verbosity, Format, ...) \    { \      CA_CONSTANT_IF((ELogVerbosity::Verbosity & ELogVerbosity::VerbosityMask) <= ELogVerbosity::COMPILED_IN_MINIMUM_VERBOSITY && (ELogVerbosity::Warning & ELogVerbosity::VerbosityMask) <= FLogCategory##CategoryName::CompileTimeVerbosity) \      { \            UE_INTERNAL_LOG_IMPL(CategoryName, Verbosity, Format, ##__VA_ARGS__); \      } \    }
打印消息到Output Log ,在编辑器的 Windows/Log/OutputLog 或者Rider的 Unreal模板 可见,内容保存在 \项目文件夹\Saved\Logs 。
4. UE_LOG(LogDiy, Error, TEXT(" Hello "));

宏定义:
/** * @param CategoryName 决定Log的名称 * @param DefaultVerbosity 决定Log的颜色 * @param CompileTimeVerbosity 决定Log的最大级别**/#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity) \      extern struct FLogCategory##CategoryName : public FLogCategory<ELogVerbosity::DefaultVerbosity, ELogVerbosity::CompileTimeVerbosity> \      { \            FORCEINLINE FLogCategory##CategoryName() : FLogCategory(TEXT(#CategoryName)) {} \      } CategoryName;/*** @param **CategoryName** 定义的Log名称 **/#define DEFINE_LOG_CATEGORY(CategoryName) FLogCategory##CategoryName CategoryName;
在.h文件添加 DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity);

在.cpp文件添加 DEFINE_LOG_CATEGORY(CategoryName);

在.cpp文件使用 UE_LOG(CategoryName, Log, TEXT(“Hello”));
代码测试(含多参数)

TestLog.h
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "GameFramework/Actor.h"#include "TestLog.generated.h"/** * @param CategoryName 决定Log的名称 * @param DefaultVerbosity 决定Log的颜色 * @param CompileTimeVerbosity 决定Log的最大级别 * 在.h文件使用DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity); ** @param CategoryName 定义的Log名称 * 在.cpp文件使用DEFINE_LOG_CATEGORY(CategoryName);**/DECLARE_LOG_CATEGORY_EXTERN(LogForInit, Log, All);/** * @brief Log测试 */UCLASS()class MICROWORLD_API ATestLog : public AActor{    GENERATED_BODY()protected:    /**   * @brief 打印所调用的函数   * @param Condition 打印的方式   */    UFUNCTION(BlueprintCallable)    bool SwitchLog(int32 Condition);};
TestLog.cpp
// Fill out your copyright notice in the Description page of Project Settings.#include "TestLog.h"#include "Kismet/KismetSystemLibrary.h"DEFINE_LOG_CATEGORY(LogForInit);bool ATestLog::SwitchLog(int32 Condition){    bool bResult = true;    switch (Condition){      case 1: {            //使用AddOnScreenDebugMessage,打印到屏幕            if (GEngine != nullptr){                GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red,                                                 TEXT("Log by GEngine.AddOnScreenDebugMessage"));            }            break;      }      case 2: {            //使用PrintString,打印到屏幕            UKismetSystemLibrary::PrintString(this,                                              TEXT("Log by UKismetSystemLibrary.PrintString"));            break;      }      case 3: {            //使用Log            UE_LOG(LogTemp, Log, TEXT("Log by UE_Log in Different Level"));            break;      }      case 4: {            //使用自定义Log            UE_LOG(LogForInit, Error, TEXT("Log by UE_Log LogForInit"));            break;      }      case 5: {            //带参数的打印            //与c语言的Printf函数类似,格式符一致            //主要是对TEXT字符串做处理,若不是基础类型或者FString类型,先转换为FString类型在打印            //注意浮点数默认打印6位小数            const bool ParamBool = true;            const int32 ParamInt = 1;            const float ParamFloat = 1233.1415f;            const double ParamDouble = 3.1415926;            //更为简单的字符串插值            //TArray<FStringFormatArg> Args;            //Args.Add(FStringFormatArg(FString::SanitizeFloat(ParamDouble,10)));            //const FString Message =FString::Format(TEXT("{0}"),Args);            const FString Message = FString::Printf(TEXT("Log by Format Parameter:\                \nParamBool:%s,\nParamInt:%d,\nParamDouble:%-20.3f,\nParamDouble:%.5lf")                                                    , (ParamBool ? TEXT("true") : TEXT("false")), ParamInt, ParamFloat,                                                    ParamDouble);            if (GEngine != nullptr){                GEngine->AddOnScreenDebugMessage(-1, 20.0f, FColor::Red,                                                 *Message);            }      }      default: {            bResult = false;            break;      }    }    return bResult;}
Log级别
enum Type : uint8    {      /** Not used */      NoLogging       = 0,      /** Always prints a fatal error to console (and log file) and crashes (even if logging is disabled) */      Fatal,      /**          * Prints an error to console (and log file).          * Commandlets and the editor collect and report errors. Error messages result in commandlet failure.         */      Error,      /**          * Prints a warning to console (and log file).         * Commandlets and the editor collect and report warnings. Warnings can be treated as an error.         */      Warning,      /** Prints a message to console (and log file) */      Display,      /** Prints a message to a log file (does not print to console) */      Log,      /**          * Prints a verbose message to a log file (if Verbose logging is enabled for the given category,          * usually used for detailed logging)          */      Verbose,      /**          * Prints a verbose message to a log file (if VeryVerbose logging is enabled,          * usually used for detailed logging that would otherwise spam output)          */      VeryVerbose,      // Log masks and special Enum values      All             = VeryVerbose,      NumVerbosity,      VerbosityMask   = 0xf,      SetColor      = 0x40, // not actually a verbosity, used to set the color of an output device         BreakOnLog      = 0x80    };
页: [1]
查看完整版本: UE 消息打印