F5.1 UPROPERTY-GetOptions
大约 2 分钟
GetOptions
通过 "Module.Class.Function" 引用外部的静态函数,使得
FString
和FName
类型的属性 能够动态生成一组有限的选项。
//类内可直接用非静态函数,类外推荐带static关键字
TArray<FString> GetNames() const
{
return {"", "牛逼", "不牛逼"};
}
UPROPERTY(EditAnywhere, meta = (GetOptions = "GetNames"))
FName Names;
UENUM(Meta = (Bitflags))
enum class EColorBits
{
ECB_Red,
ECB_Green,
ECB_Blue
};
UPROPERTY(BlueprintReadWrite,VisibleAnywhere)
FName Name;
TArray<FString> GetNames() const
{
return {"", "牛", "不牛"};
}
UPROPERTY(EditAnywhere, meta = (GetOptions = "GetNames"))
FName Names;
配合UDeveloperSettingsBackedByCVars
函数调用
1. 引用外部的静态函数


2.类内可直接调用
TArray<FString> GetNames() const
{
return {"", "牛", "不牛"};
}
UPROPERTY(EditAnywhere, meta = (GetOptions = "GetNames"))
FName Names;
案例
#if WITH_EDITOR
/**
*UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Display, Instanced, meta = (GetOptions = "GetNameOptions"))
*TMap<FName, TObjectPtr<UDataFragmentBase>> FragmentMap;
*/
UFUNCTION()
TArray<FName> GetNameOptions() const;
#endif // WITH_EDITOR
#if WITH_EDITOR
TArray<FName> UDataDefinition::GetNameOptions() const
{
TArray<FName> Options;
const UDataSystemSettings* Settings = GetDefault<UDataSystemSettings>();
if (!Settings) return Options;
if(bUseGlobalConfig)
{
Options = Settings->GlobalFragmentKeys;
}
else
{
Options = Settings->FragmentKeyPresets.FindRef(GetPrimaryAssetId().PrimaryAssetType).PresetKeys;
}
return Options;
}
# endif // WITH_EDITOR
配置类本身是单例
UCLASS(config=Game, defaultconfig, meta=(DisplayName="DataSystemSettings"))
class DATASYSTEM_API UDataSystemSettings : public UDeveloperSettingsBackedByCVars
{
GENERATED_BODY()
public:
/**
* 按 `PrimaryAssetType` 分类的 Fragment Key 预设映射
* - 主要用于不同类型的 `UDataDefinition` 具有不同的 `FragmentMap` Key 下拉选项
* - 例如:`装备` 可能有 `PickUp`, `BaseInfo`, `Skin` 等
*/
UPROPERTY(EditAnywhere, Config, Category = "Fragment Key Presets")
TMap<FPrimaryAssetType, FFragmentKeyPreset> FragmentKeyPresets;
/**
* 全局 Fragment Key 预设(适用于所有 `UDataDefinition`)
* - 如果人工勾选bUseGlobalConfig为true,则直接使用这些通用 Key
* - 如果 `FragmentKeyPresets` 中没有匹配的 `PrimaryAssetType`,则使用这些通用 Key
*/
UPROPERTY(EditAnywhere, Config, Category = "Fragment Key Presets")
TArray<FName> GlobalFragmentKeys;
};
