Unreal Engine5.4からTOptionalがUnrealHeaderToolでサポートされました!!
ただ、UnrealHeaderToolでサポートされただけで、Blueprint側で任意に型をOptionalに設定する事が現状できないので注意してください!!
公式ドキュメント
UHT に TOptional 型のサポートを追加しました。
使って見た例
インクルードに必要なヘッダーファイル
#include "Misc/Optional.h"
変数定義部分
UPROPERTY(EditAnywhere, Category = "Test")
TOptional<int32> Value;
C++側でメンバー変数でTOptional型がサポートされました。
上記のような表記をする事でToptionalを使って詳細タブで設定を行う事ができます。
値が未設定の場合
値が設定済みの場合
現状はBlueprint側に専用ノードは容易されていなさそうです。
今後に期待しましょう!
リフレクションで使うには!
ヘッダーファイル
UCLASS(Blueprintable)
class AMyActor : public AActor
{
GENERATED_BODY()
public:
virtual void BeginPlay() override;
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Test")
TOptional<FString> OptionalValue;
};
Engine\Source\Runtime\CoreUObject\Public\UObject\PropertyOptional.h
Optionalにアクセスした例
if (OptionalValue.IsSet())
{
const FString& ValueRef = OptionalValue.GetValue();
UE_LOG(LogTemp, Log, TEXT("%s"), *ValueRef);
}
OptionalValue.Reset();
リフレクションを使ってアクセスした例
auto* OptionalProperty = FindFProperty<FOptionalProperty>(GetClass(), TEXT("OptionalValue"));
void* OptionalData = OptionalProperty->ContainerPtrToValuePtr<void>(this);
if (OptionalProperty->IsSet(OptionalData))
{
FStrProperty* ValueProp = CastField<FStrProperty>(OptionalProperty->GetValueProperty());
const FString* ValuePtr = ValueProp->ContainerPtrToValuePtr<FString>(OptionalData);
if (ValuePtr)
{
const FString& ValueRef = *ValuePtr;
UE_LOG(LogTemp, Log, TEXT("%s"), *ValueRef);
}
}
OptionalProperty->MarkUnset(Data);