Enumから文字列への変換
先ずは列挙型の宣言と定義から。
UENUM(BlueprintType) enum class EConnectionType : uint8 { Multicast, Unicast, NUM UMETA(Hidden) }; class PROJECT_API AExampleActor: public AGameModeBase { GENERATED_BODY() protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Enum") EConnectionType ConnectionType; }
続いてBlueprint上でのノードの変換がこちら
Blueprintでは上図のようにEnumからStringにCastしてくれます。
しかし、C++側ではこの機能は標準で実装されていないようです。
私が知らないだけという可能性が非常に高いですが。
今回の例は結構強引な型変換を行って実装しているため
既存機能で補えたり、より良い書き方があれば教えてください。
EnumからStringへの変換についてです。
今回は説明のためにエラー処理を省略しているため
実際に使う際はエラーチェックを行うことを推奨します。
FString AExampleActor::EnumToString(const EConnectionType Type, const FString& EnumName) { UEnum* const Enum = FindObject<UEnum>(ANY_PACKAGE, *EnumName); return Enum->GetNameStringByIndex(static_cast<int32>(Type)); }
この書き方で動作はしますがEnumNameを都度渡したり
列挙型自体を引数に渡したりと汎用性は低いです。
文字列からEnumへの変換
特に使う場面も浮かびませんが、ついでなので書いておきます。
EConnectionType AExampleActor::StringToEnum(const FString& TypeName, const FString& EnumName) { UEnum* const Enum = FindObject<UEnum>(ANY_PACKAGE, *EnumName); int64 Value = Enum->GetValueByName(FName(*TypeName)); return static_cast<EConnectionType>(Value); }
上記2つの関数はUFUNCTIONマクロを付けてBlueprint上でも使用できますが
Blueprintでは
Enum -> FString は既に用意されています。
FString -> Enum は最初に書きましたが、特に使う場面が浮かびません。
以上、こういう書き方もありますよという紹介でした。