背景
输出日志的时候总是只能输出具体的值,看日志的时候一脸懵逼,我到底输出的是啥,自己都不明白日志里面一堆值是什么意思,还得查代码看每个枚举的具体值,不想这样就得在输出的位置疯狂switch写日志,不用怕,UE4解放了你,UE4可以直接输出枚举的值的名称啦
实现
在VisualLoggerTypes中,有一个很好用的宏,可以直接把枚举的值转成名称的字符串。
#if ENABLE_VISUAL_LOG
#define DEFINE_ENUM_TO_STRING(EnumType) FString EnumToString(const EnumType Value) \
{ \
static const UEnum* TypeEnum = FindObject<UEnum>(ANY_PACKAGE, TEXT(#EnumType)); \
return TypeEnum->GetNameStringByIndex(static_cast<int32>(Value)); \
}
#define DECLARE_ENUM_TO_STRING(EnumType) FString EnumToString(const EnumType Value)
#else
#define DEFINE_ENUM_TO_STRING(EnumType)
#define DECLARE_ENUM_TO_STRING(EnumType)
#endif // ENABLE_VISUAL_LOG
我们先要#include “VisualLogger/VisualLoggerTypes.h”
然后调用宏定义一个DEFINE_ENUM_TO_STRING(YourUEnum);转换函数
然后在需要转换的地方调用函数EnumToString(YourUEnum::Value);
示例
//产品型号
UENUM(BlueprintType)
enum class EColor : uint8
{
Red=0,
Green =1,
Blue =2
};
DEFINE_ENUM_TO_STRING(EColor );
FString MyColor = EnumToString(EColor ::Red);
执行之后MyColor的值为TEXT(“Red”);
注意事项
这里可以实现这个功能的枚举一定是Unreal的UENUM,因为实际使用的是UE的特性实现的。另外如果不想这么复杂,也可以直接使用宏的展开,这样的结构也是一样的
static const UEnum* TypeEnum = FindObject<UEnum>(ANY_PACKAGE, TEXT("EColor "));
FString MyColor = TypeEnum->GetNameStringByIndex(static_cast<int32>(EColor ::Red));