UE4打印信息到屏幕
GEngine->AddOnScreenDebugMessage
(
-1,
10, // 显示的时间/秒
FColor::Blue, // 显示的颜色
"Hello! UE4" // 显示的信息
);
UE4打印信息到日志
FString Message; // 显示的信息
UE_LOG
(
LogTemp, // 日志的标签
Log, // 日志的类型,Log:普通,白色 Warning:警告,黄色 Error:错误,红色
TEXT("%s"), *Message // 输出的信息,类型为FString,%s:FString %i:int %f:float
)
自定义
/* 引入自定义类的头文件: include"Helper.h"
操作符 "+" 可自定义,如 "<<" ">>"
*/
UENUM()
enum class EMyInfo:uint8
{
Name,
Birthday
};
EMyInfo MyInfo = EMyInfo::Birthday;
FString Year = "2001";
FName Month = "06";
int32 Day = 19;
//输出到屏幕
Print() + EnumToString(MyInfo, "EMyInfo") + ": " + Year + Month + Day; // 默认输出
Print(1) + EnumToString(MyInfo, "EMyInfo") + ": " + Year + Month + Day; // 1秒
Print(FColor::Blue) + EnumToString(MyInfo, "EMyInfo") + ": " + Year + Month + Day; // 蓝色
// 输出到日志
PrintLog() + "Birthday:" + Year + Month + Day; // 普通
PrintLogWarning() + "Birthday:" + Year + Month + Day; // 警告
PrintLogError() + "Birthday:" + Year + Month + Day; // 错误
步骤
1. 新建C++类,不继承任何类(None),类名为Helper.
2. 将.h文件和.cpp文件代码清空.
3. 将以下代码写入到.h文件中.
#pragma once
#include "Engine/Engine.h"
class Helper_Print
{
public:
// 控制
bool bEnable = true;
bool bPrintScreen = true;
// Screen
int32 Count = -1; // 行数
float Time = 3.f; // 时长
FColor Color = FColor::Green; // 颜色
FString Message; // 信息
// log
uint8 LogType; // 类型
public:
// 析构函数
~Helper_Print()
{
if (!bEnable || Message.IsEmpty())
{
return;
}
if (bPrintScreen && GEngine && LogType == 0)
{
GEngine->AddOnScreenDebugMessage(Count, Time, Color, Message);
}
PrintLogFromType(LogType);
}
// 初始化
void InitScreen(int32 ShowCount, float ShowTime, FColor ShowColor)
{
this->LogType = 0;
this->Count = ShowCount;
this->Time = ShowTime;
this->Color = ShowColor;
}
void InitLog(uint8 Type)
{
this->LogType = Type;
}
void PrintLogFromType(uint8 Type)
{
if (Type == 0)
{
if (Color == FColor::Yellow)
{
Type = 2;
}
else if (Color == FColor::Red)
{
Type = 3;
}
}
switch (Type)
{
case 0:
case 1:
UE_LOG(LogTemp, Log, TEXT("%s"), *Message)
break;
case 2:
UE_LOG(LogTemp, Warning, TEXT("%s"), *Message)
break;
case 3:
UE_LOG(LogTemp, Error, TEXT("%s"), *Message)
break;
}
}
// 操作符重写
Helper_Print& operator+ (int32 Info) { Message.Append(FString::FromInt(Info)); return *this; }
Helper_Print& operator+ (float Info) { Message.Append(FString::SanitizeFloat(Info)); return *this; }
Helper_Print& operator+ (double Info) { Message.Append(FString::SanitizeFloat(Info)); return *this; }
Helper_Print& operator+ (bool Info) { Message.Append(Info ? FString("true") : FString("false")); return *this; }
//安卓弃用Helper_Print& operator+ (const wchar_t* Info) { Message += Info; return *this; }
Helper_Print& operator+ (const char* Info) { Message += UTF8_TO_TCHAR(Info); return *this; }
Helper_Print& operator+ (const char Info) { Message.AppendChar(Info); return *this; }
Helper_Print& operator+ (FString Info) { Message.Append(Info); return *this; };
Helper_Print& operator+ (FName Info) { Message.Append(Info.ToString()); return *this; }
Helper_Print& operator+ (FText Info) { Message.Append(Info.ToString()); return *this; }
Helper_Print& operator+ (FVector2D Info) { Message.Append(Info.ToString()); return *this; }
Helper_Print& operator+ (FVector Info) { Message.Append(Info.ToString()); return *this; }
Helper_Print& operator+ (FRotator Info) { Message.Append(Info.ToString()); return *this; }
Helper_Print& operator+ (FQuat Info) { Message.Append(Info.ToString()); return *this; }
Helper_Print& operator+ (FTransform Info) { Message.Append(Info.ToString()); return *this; }
Helper_Print& operator+ (FMatrix Info) { Message.Append(Info.ToString()); return *this; }
Helper_Print& operator+ (FColor Info) { Message.Append(Info.ToString()); return *this; }
Helper_Print& operator+ (FLinearColor Info) { Message.Append(Info.ToString()); return *this; }
};
// Screen
FORCEINLINE Helper_Print Print()
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitScreen(PrintHelper.Count, PrintHelper.Time, PrintHelper.Color);
return PrintHelper;
}
FORCEINLINE Helper_Print Print(int Count)
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitScreen(Count, PrintHelper.Time, PrintHelper.Color);
return PrintHelper;
}
FORCEINLINE Helper_Print Print(float Time)
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitScreen(PrintHelper.Count, Time, PrintHelper.Color);
return PrintHelper;
}
FORCEINLINE Helper_Print Print(FColor Color)
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitScreen(PrintHelper.Count, PrintHelper.Time, Color);
return PrintHelper;
}
FORCEINLINE Helper_Print Print(int Count, float Time)
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitScreen(Count, Time, PrintHelper.Color);
return PrintHelper;
}
FORCEINLINE Helper_Print Print(int Count, FColor Color)
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitScreen(Count, PrintHelper.Time, Color);
return PrintHelper;
}
FORCEINLINE Helper_Print Print(float Time, FColor Color)
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitScreen(PrintHelper.Count, Time, Color);
return PrintHelper;
}
FORCEINLINE Helper_Print Print(int Count, float Time, FColor Color)
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitScreen(Count, Time, Color);
return PrintHelper;
}
// log
FORCEINLINE Helper_Print PrintLog()
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitLog(1);
return PrintHelper;
}
FORCEINLINE Helper_Print PrintLogWarning()
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitLog(2);
return PrintHelper;
}
FORCEINLINE Helper_Print PrintLogError()
{
Helper_Print PrintHelper = Helper_Print();
PrintHelper.InitLog(3);
return PrintHelper;
}
// 枚举转换
template<typename TEnum>
FORCEINLINE FString EnumValueToString(FString EnumTypeName, TEnum EnumValue)
{
UEnum* EnumPtr = FindObject<UEnum>((UObject*)ANY_PACKAGE, *EnumTypeName, true);
if (!EnumPtr)
{
return FString("InvaildEnumName");
}
return EnumPtr->GetNameStringByIndex((int32)EnumValue);
}
template<typename TEnum>
FORCEINLINE TEnum StringToEnumValue(FString EnumTypeName, FString StringEnumValue)
{
UEnum* EnumPtr = FindObject<UEnum>((UObject*)ANY_PACKAGE, *EnumTypeName, true);
if (!EnumPtr)
{
return TEnum(0);
}
return (TEnum)EnumPtr->GetIndexByNameString(StringEnumValue);
}
template<typename TEnum>
FORCEINLINE int32 StringToEnumIndex(FString EnumTypeName, FString EnumValue)
{
UEnum* EnumPtr = FindObject<UEnum>((UObject*)ANY_PACKAGE, *EnumTypeName, true);
if (!EnumPtr)
{
return -1;
}
return EnumPtr->GetIndexByNameString(EnumValue);
}