PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 Unreal C++でのEnumとStringの変換について

環境

UE4.20.3
Visual Studio 2017 Community

Unreal C++でのenumについてはこちら
papersloth.hatenablog.com

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上でのノードの変換がこちら
f:id:PaperSloth:20190514231350p:plain


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 は最初に書きましたが、特に使う場面が浮かびません。


以上、こういう書き方もありますよという紹介でした。