vault backup: 2024-10-12 17:19:45
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
# EnumDisplayNameFn
|
||||
|
||||
- **功能描述:** 在Runtime下为枚举字段提供自定义名称的函数回调
|
||||
- **使用位置:** UENUM
|
||||
- **引擎模块:** Enum Property
|
||||
- **元数据类型:** string="abc"
|
||||
- **常用程度:** ★★
|
||||
|
||||
只在Runtime下生效,在Editor下依然不起作用。
|
||||
|
||||
## 测试代码:
|
||||
|
||||
```cpp
|
||||
//[EMyEnum_CustomDisplay Enum->Field->Object /Script/Insider.EMyEnum_CustomDisplay]
|
||||
//(BlueprintType = true, EnumDisplayNameFn = GetMyEnumCustomDisplayName, First.Name = EMyEnum_CustomDisplay::First, IsBlueprintBase = true, ModuleRelativePath = Enum/MyEnum_Test.h, Second.Name = EMyEnum_CustomDisplay::Second, Third.Name = EMyEnum_CustomDisplay::Third)
|
||||
// ObjectFlags: RF_Public | RF_Transient
|
||||
// Outer: Package /Script/Insider
|
||||
// EnumFlags: EEnumFlags::None
|
||||
// EnumDisplayNameFn: 6adb4804
|
||||
// CppType: EMyEnum_CustomDisplay
|
||||
// CppForm: EnumClass
|
||||
//{
|
||||
// First = 0,
|
||||
// Second = 1,
|
||||
// Third = 2,
|
||||
// EMyEnum_MAX = 3
|
||||
//};
|
||||
|
||||
UENUM(Blueprintable, meta = (EnumDisplayNameFn = "GetMyEnumCustomDisplayName"))
|
||||
enum class EMyEnum_CustomDisplay :uint8
|
||||
{
|
||||
First,
|
||||
Second,
|
||||
Third,
|
||||
};
|
||||
|
||||
extern FText GetMyEnumCustomDisplayName(int32 val);
|
||||
|
||||
FText GetMyEnumCustomDisplayName(int32 val)
|
||||
{
|
||||
EMyEnum_CustomDisplay enumValue = (EMyEnum_CustomDisplay)val;
|
||||
switch (enumValue)
|
||||
{
|
||||
case EMyEnum_CustomDisplay::First:
|
||||
return FText::FromString(TEXT("My_First"));
|
||||
case EMyEnum_CustomDisplay::Second:
|
||||
return FText::FromString(TEXT("My_Second"));
|
||||
case EMyEnum_CustomDisplay::Third:
|
||||
return FText::FromString(TEXT("My_Third"));
|
||||
default:
|
||||
return FText::FromString(TEXT("Invalid MyEnum"));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 测试蓝图:
|
||||
|
||||

|
||||
|
||||
EnumDisplayNameFn 的函数设置是在gen.cpp中完成的,因此并不需要成为UFUNCTION。
|
||||
|
||||
```cpp
|
||||
const UECodeGen_Private::FEnumParams Z_Construct_UEnum_Insider_EMyEnum_CustomDisplay_Statics::EnumParams = {
|
||||
(UObject*(*)())Z_Construct_UPackage__Script_Insider,
|
||||
GetMyEnumCustomDisplayName, //这里!!!
|
||||
"EMyEnum_CustomDisplay",
|
||||
"EMyEnum_CustomDisplay",
|
||||
Z_Construct_UEnum_Insider_EMyEnum_CustomDisplay_Statics::Enumerators,
|
||||
RF_Public|RF_Transient|RF_MarkAsNative,
|
||||
UE_ARRAY_COUNT(Z_Construct_UEnum_Insider_EMyEnum_CustomDisplay_Statics::Enumerators),
|
||||
EEnumFlags::None,
|
||||
(uint8)UEnum::ECppForm::EnumClass,
|
||||
METADATA_PARAMS(UE_ARRAY_COUNT(Z_Construct_UEnum_Insider_EMyEnum_CustomDisplay_Statics::Enum_MetaDataParams), Z_Construct_UEnum_Insider_EMyEnum_CustomDisplay_Statics::Enum_MetaDataParams)
|
||||
};
|
||||
```
|
||||
|
||||
## 原理代码:
|
||||
|
||||
```cpp
|
||||
|
||||
/FText UEnum::GetDisplayNameTextByIndex(int32 NameIndex) const
|
||||
{
|
||||
FString RawName = GetNameStringByIndex(NameIndex);
|
||||
|
||||
if (RawName.IsEmpty())
|
||||
{
|
||||
return FText::GetEmpty();
|
||||
}
|
||||
|
||||
#if WITH_EDITOR
|
||||
FText LocalizedDisplayName;
|
||||
// In the editor, use metadata and localization to look up names
|
||||
static const FString Namespace = TEXT("UObjectDisplayNames");
|
||||
const FString Key = GetFullGroupName(false) + TEXT(".") + RawName;
|
||||
|
||||
FString NativeDisplayName;
|
||||
if (HasMetaData(TEXT("DisplayName"), NameIndex))
|
||||
{
|
||||
NativeDisplayName = GetMetaData(TEXT("DisplayName"), NameIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
NativeDisplayName = FName::NameToDisplayString(RawName, false);
|
||||
}
|
||||
|
||||
if (!(FText::FindText(Namespace, Key, /*OUT*/LocalizedDisplayName, &NativeDisplayName)))
|
||||
{
|
||||
LocalizedDisplayName = FText::FromString(NativeDisplayName);
|
||||
}
|
||||
|
||||
if (!LocalizedDisplayName.IsEmpty())
|
||||
{
|
||||
return LocalizedDisplayName;
|
||||
}
|
||||
#endif
|
||||
//Runtime下到这里
|
||||
if (EnumDisplayNameFn)
|
||||
{
|
||||
return (*EnumDisplayNameFn)(NameIndex);
|
||||
}
|
||||
|
||||
return FText::FromString(GetNameStringByIndex(NameIndex));
|
||||
}
|
||||
```
|
Binary file not shown.
After Width: | Height: | Size: 73 KiB |
Reference in New Issue
Block a user