プロパティ メタデータ指定子のメモ

UPROPERTYのmeta指定子の使用時の挙動などを備忘録も兼ねて書きます。
※この記事で検証していることは実際にそのmeta指定子の処理を見に行ったわけではないです。
 本記事で公式ドキュメントの記載とは違う動きをしている箇所がいくつかありますが、それがバグか筆者の使い方が間違えているのかの判断は各自検証してからしていただくようお願いします。(もし間違えてたら優しく教えてください!)

参考:Unreal Engine | メタデータ指定子



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のように定義した場合結果は以下のようになります。
f:id:kamitani_08:20190423160932p:plain
f:id:kamitani_08:20190423160735p:plain



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;

こんな感じ
f:id:kamitani_08:20190423153535p:plain

WorldAndDataTableもばっちし
f:id:kamitani_08:20190423153653p:plain

ただAllowedClassesは自作のクラスや、一部クラスのには効かないみたいです。(4.22環境)

UPROPERTY(EditAnywhere, meta = (AllowedClasses = "ActorComponent"))
	FSoftObjectPath ActorComponent;

f:id:kamitani_08:20190427163833p:plain



AllowPreserveRatio

このプロパティを [Details (詳細)] パネルに表示するときに、ratio のロックが追加されます。
ロックすると、現在のxyzスケール値に基づいて均等に拡大縮小されるため、拡大縮小してもオブジェクトは各方向にその形状を維持します。

例:

UPROPERTY(EditAnywhere, meta = (AllowPreserveRatio))
	FVector Vector3 {};
UPROPERTY(EditAnywhere)
	FVector DefaultVector {};

f:id:kamitani_08:20190423164729p:plain


ArrayClamp

エディタ上で入力する値を 0 と配列のプロパティの名前の長さにクランプします。
配列サイズが0の場合は-1が入るようです。

UPROPERTY(EditAnywhere, meta = (ArrayClamp = "Array"))
	int32 Index{};
UPROPERTY(EditAnywhere)
	TArray<int> Array{};

ただ上記動画からもわかるように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;

f:id:kamitani_08:20190423211901p:plain

Directory_Bの方だとエクスプローラーで指定する形になります。


DisplayName

エディタでの表示名を指定できます。

UPROPERTY(EditAnywhere, meta = (DisplayName="Index"))
	int hogehoge{1234};
UPROPERTY(EditAnywhere)
	int TestTest{};

f:id:kamitani_08:20190423212909p:plain


DisplayThumbnail

プロパティがアセット タイプであることを示し、選択したアセットのサムネイルを表示します。>公式より
たとえば:

UPROPERTY(EditAnywhere, meta = (DisplayThumbnail = "true"))
	UTexture2D* PaintTexture_A;
UPROPERTY(EditAnywhere ,meta = (DisplayThumbnail = "false"))
	UTexture2D* PaintTexture_B;

上記のようなコードを書くとこうなる。

f:id:kamitani_08:20190423214037p:plain
ちなみにデフォルトは(DisplayThumbnail = "true")の状態みたいです


EditCondition

このプロパティの編集を無効にするかどうかを示すために使うブール プロパティに名前を付けます。プロパティ名の前に "!" を付けるとテストが反転します。>公式より

たとえば:

UPROPERTY(EditAnywhere)
	bool bUseConstantValue{};
UPROPERTY(EditAnywhere, meta = (EditCondition = bUseConstantValue))
	float ConstantValue{};

上記のようなコードを書いた際には下記のように「bUseConstantValue == false」の際には ConstantValue は編集できなくなっているのがわかります。
f:id:kamitani_08:20190423215126p:plain



EditFixedOrder

ドラッグすることで配列の要素の順番が変わるのを防ぎます>公式より

UPROPERTY(EditAnywhere, meta = (EditFixedOrder))
	TArray<int> Array_A;
UPROPERTY(EditAnywhere)
	TArray<int> Array_B;

f:id:kamitani_08:20190423220333p:plain



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;

f:id:kamitani_08:20190427172613p:plain


ただ今回検証した感じだと「関数を公開するカテゴリのリストを指定」しているかは関係ないみたいです。(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;

f:id:kamitani_08:20190427172420p:plain




ExposeOnSpawn

このクラスのタイプで Spawn Actor ノードでこのプロパティを公開するかを指定します。>公式より
たとえばこうなります。

UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ExposeOnSpawn))
	int Num_A{};
UPROPERTY(EditAnywhere, BlueprintReadWrite)
	int Num_B{};

f:id:kamitani_08:20190427174740p:plain



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を選択した際の表示)
f:id:kamitani_08:20190427181039p:plain


HideAlphaChannel

FColor プロパティと FLinearColor プロパティで使用されます。詳細で、プロパティウィジェットを表示するときに Alpha プロパティが非表示になることを示します。>公式より
たとえば:

UPROPERTY(EditAnywhere)
	FColor Color_A {};
UPROPERTY(EditAnywhere, meta = (HideAlphaChannel))
	FColor Color_B {};

f:id:kamitani_08:20190427181755p:plain
上記コードだとこうなります。


カラーピッカーでもAlpha プロパティが表示になっていることも確認。
f:id:kamitani_08:20190427181928p:plain




HideViewOptions

Subclass と SoftClass のプロパティで使用されます。クラスピッカーで表示オプションを変更する機能を隠します。>公式より

UPROPERTY(EditAnywhere, meta = (HideViewOptions))
	FSoftClassPath SoftClass_A;
UPROPERTY(EditAnywhere)
	FSoftClassPath SoftClass_B;

f:id:kamitani_08:20190427183714p:plain



InlineEditConditionToggle

他のプロパティで切り替わり、単独では表示されない編集条件として、ブール プロパティはインラインでのみ表示されることを表します。>公式より
たとえば:

UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (InlineEditConditionToggle, ExposeOnSpawn))
	bool bFlag_A{};
UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bFlag_B{};

このように書くとbFlag_Aは詳細には表示されません
f:id:kamitani_08:20190427185021p:plain

GetSetは通常通りに行えます。
f:id:kamitani_08:20190427185118p:plain




LongPackageName

FDirectoryPath プロパティによって使用されます。パスを長いパッケージ名に変換します。>公式より
どうやらパスを絶対か相対か切り替えることが出来ます。
たとえば:

UPROPERTY(EditAnywhere)
	FDirectoryPath DirectoryPath_A;
UPROPERTY(EditAnywhere , meta = (LongPackageName))
	FDirectoryPath DirectoryPath_B;

f:id:kamitani_08:20190427192031p:plain



あれ?



代入時に変換しているのかな?
f:id:kamitani_08:20190427192110p:plain
f:id:kamitani_08:20190427192159p:plain
変わらない....
LongPackageNameは機能していないのか...?(誰か教えて!!!


MakeEditWidget

Transform プロパティ、Rotator プロパティ、または Transforms、Rotators の配列で使用されます。移動可能なウィジェットとしてプロパティがビューポートに公開されることを示します。>公式より
これを指定することによってビューポート上にプロパティが表示されるようになります。