プロパティ メタデータ指定子のメモ
UPROPERTYのmeta指定子の使用時の挙動などを備忘録も兼ねて書きます。
※この記事で検証していることは実際にそのmeta指定子の処理を見に行ったわけではないです。
本記事で公式ドキュメントの記載とは違う動きをしている箇所がいくつかありますが、それがバグか筆者の使い方が間違えているのかの判断は各自検証してからしていただくようお願いします。(もし間違えてたら優しく教えてください!)
- AllowAbstract
- AllowedClasses
- AllowPreserveRatio
- ArrayClamp
- BlueprintCompilerGeneratedDefaults
- ClampMin、ClampMax
- ConfigHierarchyEditable
- ContentDir
- DisplayName
- DisplayThumbnail
- EditCondition
- EditFixedOrder
- ExactClass
- ExposeFunctionCategories
- ExposeOnSpawn
- FilePathFilter
- HideAlphaChannel
- HideViewOptions
- InlineEditConditionToggle
- LongPackageName
- MakeEditWidget
AllowAbstract
Subclass と SoftClass のプロパティで使用され、クラスピッカーで抽象クラス型を表示するかを指定することが出来ます。
たとえば:
UCLASS(Abstract,ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) class TANKMYPROJECT_API UMyAbstractActorComponent : public UActorComponent { GENERATED_BODY() public: // Sets default values for this component's properties UMyAbstractActorComponent(); protected: // Called when the game starts virtual void BeginPlay() override; public: // Called every frame virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; };
UCLASS() class TANKMYPROJECT_API UMyActorComponent : public UMyAbstractActorComponent { GENERATED_BODY() };
※1
UPROPERTY(EditAnywhere) TSubclassOf<class UMyAbstractActorComponent> Subclass_A; UPROPERTY(EditAnywhere, meta = (AllowAbstract)) TSubclassOf<class UMyAbstractActorComponent> Subclass_B;
class UMyAbstractActorComponent はUCLASSにAbstractを追加して抽象クラスにしています。
これを※1のように定義した場合結果は以下のようになります。
AllowedClasses
FSoftObjectPath プロパティで使われ、アセットピッカーに表示されるクラスを制限することが出来ます。
UPROPERTY(EditAnywhere, meta = (AllowedClasses = "World")) FSoftObjectPath World; UPROPERTY(EditAnywhere, meta = (AllowedClasses = "Texture")) FSoftObjectPath Texture; UPROPERTY(EditAnywhere, meta = (AllowedClasses = "Material")) FSoftObjectPath Material; UPROPERTY(EditAnywhere, meta = (AllowedClasses = "Font")) FSoftObjectPath Font; UPROPERTY(EditAnywhere, meta = (AllowedClasses = "DataTable")) FSoftObjectPath DataTable; UPROPERTY(EditAnywhere, meta = (AllowedClasses = "MaterialInterface")) FSoftObjectPath MaterialInterface; UPROPERTY(EditAnywhere, meta = (AllowedClasses = "World,DataTable")) FSoftObjectPath WorldAndDataTable;
こんな感じ
WorldAndDataTableもばっちし
ただAllowedClassesは自作のクラスや、一部クラスのには効かないみたいです。(4.22環境)
UPROPERTY(EditAnywhere, meta = (AllowedClasses = "ActorComponent"))
FSoftObjectPath ActorComponent;
AllowPreserveRatio
このプロパティを [Details (詳細)] パネルに表示するときに、ratio のロックが追加されます。
ロックすると、現在のxyzスケール値に基づいて均等に拡大縮小されるため、拡大縮小してもオブジェクトは各方向にその形状を維持します。
例:
UPROPERTY(EditAnywhere, meta = (AllowPreserveRatio)) FVector Vector3 {}; UPROPERTY(EditAnywhere) FVector DefaultVector {};
ArrayClamp
エディタ上で入力する値を 0 と配列のプロパティの名前の長さにクランプします。
配列サイズが0の場合は-1が入るようです。
UPROPERTY(EditAnywhere, meta = (ArrayClamp = "Array")) int32 Index{}; UPROPERTY(EditAnywhere) TArray<int> Array{};
UEC++のお気持ちを理解しようとUPROPERTYのメタデータ指定子見てる。
— 上谷@タイムマシン求 (@kamitani_08) 2019年4月23日
なにこれめっちゃ便利 pic.twitter.com/U1mFSpMlhx
ただ上記動画からもわかるようにArrayの要素数を変更した際にはIndexのClamp処理が行われず、エラーや警告も発生しないことに注意してください。
BlueprintCompilerGeneratedDefaults
Subclass と SoftClass のプロパティで使用されます。クラス ピッカーで Blueprint クラスのみを表示するかを示します。>公式より
ClampMin、ClampMax
どちらも float と integer のプロパティに使用され、ClampMin はプロパティに入力可能な最小値、ClampMax は最大値を指定します。
たとえば:
UPROPERTY(EditAnywhere, meta = (ClampMin = 5, ClampMax = 10)) int Index{5};
こうすればIndex変更時にClampMin から ClampMaxまでの値にClampされます。
もちろんClampMin と ClampMax は単体でも使用可能です。
ConfigHierarchyEditable
このプロパティは、 config (.ini) ファイルにシリアル化されて、 config 階層のどこにでも設定することができます。>公式より
ContentDir
FDirectoryPath プロパティによって使用されます。このパスは、Content フォルダ内のスレート スタイルのディレクトリ ピッカーを使って選ぶことができます。>公式より
つまりこうゆう事
UPROPERTY(EditAnywhere, meta = (ContentDir)) FDirectoryPath Directory_A; UPROPERTY(EditAnywhere) FDirectoryPath Directory_B;
Directory_Bの方だとエクスプローラーで指定する形になります。
DisplayName
エディタでの表示名を指定できます。
UPROPERTY(EditAnywhere, meta = (DisplayName="Index")) int hogehoge{1234}; UPROPERTY(EditAnywhere) int TestTest{};
DisplayThumbnail
プロパティがアセット タイプであることを示し、選択したアセットのサムネイルを表示します。>公式より
たとえば:
UPROPERTY(EditAnywhere, meta = (DisplayThumbnail = "true")) UTexture2D* PaintTexture_A; UPROPERTY(EditAnywhere ,meta = (DisplayThumbnail = "false")) UTexture2D* PaintTexture_B;
上記のようなコードを書くとこうなる。
ちなみにデフォルトは(DisplayThumbnail = "true")の状態みたいです
EditCondition
このプロパティの編集を無効にするかどうかを示すために使うブール プロパティに名前を付けます。プロパティ名の前に "!" を付けるとテストが反転します。>公式より
たとえば:
UPROPERTY(EditAnywhere) bool bUseConstantValue{}; UPROPERTY(EditAnywhere, meta = (EditCondition = bUseConstantValue)) float ConstantValue{};
上記のようなコードを書いた際には下記のように「bUseConstantValue == false」の際には ConstantValue は編集できなくなっているのがわかります。
EditFixedOrder
ドラッグすることで配列の要素の順番が変わるのを防ぎます>公式より
UPROPERTY(EditAnywhere, meta = (EditFixedOrder)) TArray<int> Array_A; UPROPERTY(EditAnywhere) TArray<int> Array_B;
ExactClass
AllowedClasses と合わせて FSoftObjectPath プロパティで使用されます。AllowedClasses で指定されているものと同じクラスだけを使用可能か、サブクラスも有効であるかを示します。>公式より
ちなみに:
UPROPERTY(EditAnywhere, meta = (AllowedClasses = "SkeletalMesh")) FSoftObjectPath SkeletalMesh_A; UPROPERTY(EditAnywhere, meta = (AllowedClasses = "SkeletalMesh", ExactClass = "false")) FSoftObjectPath SkeletalMesh_B;
上記SkeletalMesh_AはSkeletalMesh_Bで宣言した時と同じ処理になります。
ExposeFunctionCategories
ブループリント エディタで関数リストを構築するときに関数を公開するカテゴリのリストを指定します。>公式より
たとえばこうゆう事です。
UPROPERTY( VisibleAnywhere, BlueprintReadOnly, meta = (ExposeFunctionCategories = "Components|SkeletalMesh")) class USkeletalMeshComponent* SkeletalMeshComponent_A; UPROPERTY(VisibleAnywhere, BlueprintReadOnly) class USkeletalMeshComponent* SkeletalMeshComponent_B;
ただ今回検証した感じだと「関数を公開するカテゴリのリストを指定」しているかは関係ないみたいです。(4.22)
UPROPERTY( VisibleAnywhere, BlueprintReadOnly, meta = (ExposeFunctionCategories = "Components|SkeletalMesh")) class USkeletalMeshComponent* SkeletalMeshComponent_A; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, meta = (ExposeFunctionCategories = "")) class USkeletalMeshComponent* SkeletalMeshComponent_B; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, meta = (ExposeFunctionCategories)) class USkeletalMeshComponent* SkeletalMeshComponent_C;
ExposeOnSpawn
このクラスのタイプで Spawn Actor ノードでこのプロパティを公開するかを指定します。>公式より
たとえばこうなります。
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn)) int Num_A{}; UPROPERTY(EditAnywhere, BlueprintReadWrite) int Num_B{};
FilePathFilter
FFilePath プロパティによって使用されます。ファイル ピッカーで表示するパス フィルタを示します。共通の値として、"uasset" と "umap" 値を含みますが、他にも使える値があります。>公式より
たとえば:
UPROPERTY(EditAnywhere, Category = Automation, meta = (FilePathFilter = "uasset")) FFilePath FilePath_uasset; UPROPERTY(EditAnywhere, Category = Automation, meta = (FilePathFilter = "umap")) FFilePath FilePath_umap; UPROPERTY(EditAnywhere, Category = Automation, meta = (FilePathFilter = "*")) FFilePath FilePath_asterisk;
ここが変わります。(図はFilePath_uassetを選択した際の表示)
HideAlphaChannel
FColor プロパティと FLinearColor プロパティで使用されます。詳細で、プロパティウィジェットを表示するときに Alpha プロパティが非表示になることを示します。>公式より
たとえば:
UPROPERTY(EditAnywhere) FColor Color_A {}; UPROPERTY(EditAnywhere, meta = (HideAlphaChannel)) FColor Color_B {};
上記コードだとこうなります。
カラーピッカーでもAlpha プロパティが表示になっていることも確認。
HideViewOptions
Subclass と SoftClass のプロパティで使用されます。クラスピッカーで表示オプションを変更する機能を隠します。>公式より
UPROPERTY(EditAnywhere, meta = (HideViewOptions)) FSoftClassPath SoftClass_A; UPROPERTY(EditAnywhere) FSoftClassPath SoftClass_B;
InlineEditConditionToggle
他のプロパティで切り替わり、単独では表示されない編集条件として、ブール プロパティはインラインでのみ表示されることを表します。>公式より
たとえば:
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (InlineEditConditionToggle, ExposeOnSpawn)) bool bFlag_A{}; UPROPERTY(EditAnywhere, BlueprintReadWrite) bool bFlag_B{};
このように書くとbFlag_Aは詳細には表示されません
GetSetは通常通りに行えます。
LongPackageName
FDirectoryPath プロパティによって使用されます。パスを長いパッケージ名に変換します。>公式より
どうやらパスを絶対か相対か切り替えることが出来ます。
たとえば:
UPROPERTY(EditAnywhere) FDirectoryPath DirectoryPath_A; UPROPERTY(EditAnywhere , meta = (LongPackageName)) FDirectoryPath DirectoryPath_B;
あれ?
代入時に変換しているのかな?
変わらない....
LongPackageNameは機能していないのか...?(誰か教えて!!!
MakeEditWidget
Transform プロパティ、Rotator プロパティ、または Transforms、Rotators の配列で使用されます。移動可能なウィジェットとしてプロパティがビューポートに公開されることを示します。>公式より
これを指定することによってビューポート上にプロパティが表示されるようになります。