環境
Unreal Engine 4.17.2
概要
Blueprintに公開可能な型と公開できない型を書いていきます。
他にも追記した方がいいことがあれば、コメントやTwitterで指摘いただけると助かります。
UPROPERTYで説明していますが、UFUNCTIONでも基本的に同様です。
enumはUENUMを付ければ公開可能です。
structはUSTRUCTを付けてBlueprintTypeが指定されていれば公開可能です。
コードは下記クラスに追加していきます。
因みにUPROPERTYでCategoryを指定しない場合はクラス名がカテゴリ名になります。
#pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "ReflectionActor.generated.h" UCLASS() class PROJECTNAME_API AReflectionActor : public AActor { GENERATED_BODY() public: AReflectionActor(); private: // ここに変数を追加 };
Blueprintに公開可能な型
公開可能なプリミティブ型
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) bool _bool; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) uint8 _uint; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) int32 _int; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) float _float;
公開可能なUE4の型
ここではよく使う型だけを紹介します。
他にも挙げきれないくらい種類があります。
一部の構造体とUObjectを継承しているクラスポインタが公開可能です。
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FName name; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FString string; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FText text; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FVector vector; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FRotator rotator; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FTransform transform; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) UObject* _object;
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FMatrix matrix; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FQuat quat;
Matrix, QuaternionはBlueprintへの公開は可能です。
ですが、これらを操作するための関数はBlueprintにはほとんど公開されていません。
公開可能な構造体、列挙型
USTRUCT(BlueprintType) struct FFoo { GENERATED_USTRUCT_BODY() float _float; UPROPERTY(EditAnywhere, BlueprintReadWrite) int32 _int; }; // 省略 UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FFoo foo;
この場合はUPROPERTYを公開設定で付与した_intのみがBlueprint上に公開されます。
UENUM() enum class EBar : uint8 { State1, State2, State3, Num UMETA(Hidden) }; UENUM() namespace EBaz { enum Type { State1, State2, State3, Num UMETA(Hidden) }; } // 省略 UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) EBar bar; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TEnumAsByte<EBaz::Type> baz;
enumの書き方を2種類紹介しましたが、Blueprintからの見え方は同じです。
EBazのような古いenumの書き方を示したのには理由があります。
UE4のエンジンコードにはまだ古い書き方が残っているため
それらを利用する際にTEnumAsByteを使用します。
自身で列挙型を定義する際は上のEBarのような書き方をオススメします。
詳しくはこちら
papersloth.hatenablog.com
公開可能なcontainer
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TArray<int32> _array; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TMap<int32, int32> map; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TSet<int32> set;
ここではintを指定していますが
公開可能なプリミティブ型、構造体、クラスポインタは基本的に使用可能です。
また、Map, SetのBlueprintでの扱いに関してですが
4.13以下では使用不可
4.14では実験的な機能
4.15から正式なサポートとなります。
Blueprintに公開不可能な型
これらはC++側では当然使用可能ですが、Blueprintへの公開はできません。
UPROPERTY, UFUNCTIONを付与するとエラーとなります。
Blueprintで使用したい場合はcastするなどの対応が必要です。
数が多いため、一部のみを抜粋しています。
プリミティブ型
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) uint16 _uint16; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) uint32 _uint32; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) uint64 _uint64; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) int8 _int8; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) int16 _int16; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) int64 _int64; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) double _double;
UE4で定義された型、container
#include "Containers/StaticArray.h" // 省略 UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FMatrix2x2 mat22; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TStaticArray<int32, 10> staticArray;
コード全容
// Copyright(c) 2018 PaperSloth #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "Containers/StaticArray.h" #include "ReflectionActor.generated.h" USTRUCT(BlueprintType) struct FFoo { GENERATED_USTRUCT_BODY() float _float; UPROPERTY(EditAnywhere, BlueprintReadWrite) int32 _int; }; UENUM() enum class EBar : uint8 { State1, State2, State3, Num UMETA(Hidden) }; UENUM() namespace EBaz { enum Type { State1, State2, State3, Num UMETA(Hidden) }; } UCLASS() class PROJECTNAME_API AReflectionActor : public AActor { GENERATED_BODY() public: AReflectionActor(); private: UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FFoo foo; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) EBar bar; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TEnumAsByte<EBaz::Type> baz; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) bool _bool; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) uint8 _uint; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) int32 _int; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) float _float; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FName name; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FString string; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FText text; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FVector vector; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FRotator rotator; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FTransform transform; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) UObject* _object; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FMatrix matrix; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FQuat quat; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TArray<int32> _array; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TMap<int32, int32> map; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TSet<int32> set; #if 0 UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) uint16 _uint16; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) uint32 _uint32; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) uint64 _uint64; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) int8 _int8; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) int16 _int16; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) int64 _int64; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) double _double; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) FMatrix2x2 mat22; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true")) TStaticArray<int32, 10> staticArray; #endif };