|
執筆バージョン: Unreal Engine 5.7.1
|
レベルにアクターを配置したとき独自カテゴリが下に埋もれてしまっている経験をめちゃくちゃします。
触ってほしいプロパティなのでできればTransformの下あたりに来てほしいところです。

UCLASSやUPROPERTYのパラメーターで操作できないかと調べてみたところ、
「PrioritizeCategories」を見つけて使用してみましたが変化がなし…。
カテゴリの表示順をどうすれば操作できるのか気になったので調べました。
Detailsパネルに表示されるカテゴリ順の仕組み
※例として以下のクラスを使用します。
|
|
UCLASS() class MYPROJECT_API AMyCharacter : public ACharacter { GENERATED_BODY() public: UPROPERTY(VisibleAnywhere, Category = "MyProject") TObjectPtr StaticMeshComponent; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MyProject") bool bBoolProperty; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MyProject") int32 IntProperty; }; |
カテゴリ順が決まる流れは大きく3つに分かれるようです。
①クラスからカテゴリとプロパティの収集
対象のクラスから親クラスまで遡って、定義されているプロパティとそのカテゴリを上から順々に収集します。
ここでベースとなる最初の並び順が決まります。

そして以下のような情報が生成されます。
|
|
①MyProjectカテゴリ ├─1.StaticMeshComponent ├─2.bBoolProperty ├─3.IntProperty ②Characterカテゴリ ├─1.Mesh ├─2.CharacterMovement ├─3.CapsuleComponent ・・・ |
補足:
- Detailsパネルに表示対象のプロパティのみ(VisibleAnywhereなど)
- 「PrioritizeCategories」はこの段階で収集したカテゴリを並び替える
- カテゴリの最初のプロパティがBlueprint非公開だと、優先順位が下がる
②Detailsパネルのレイアウトの構築
①の情報を使用して、実際にDetailsパネルへ表示するレイアウトを構築します。
この時、
Componentプロパティは内部に持っているプロパティまで含めて展開されます。
展開されたプロパティのカテゴリも追加されるため、Componentプロパティの定義順によってはカテゴリが途中に割り込んで順番がずれることが発生します。

③カスタマイズが適用され、最終的な順番になる
UE5にはクラス単位でDetailsパネルをカスタマイズをする仕組みがあり、登録されているカスタマイズ内容がここで適用されます。
エンジン側でも多くのクラスがカスタマイズされており、
- Transform:FActorDetails
- StaticMesh:FStaticMeshComponentDetails
- Animation:FSkeletalMeshComponentDetails
などのカテゴリは、意図的に上の方に来るよう設定されています。
|
|
IDetailCategoryBuilder& TransformCategory = DetailBuilder.EditCategory( "TransformCommon", LOCTEXT("TransformCommonCategory", "Transform"), ECategoryPriority::Transform ); |
|
|
DetailBuilder.EditCategory("StaticMesh", FText::GetEmpty(), ECategoryPriority::Important); |
|
|
DetailBuilder.EditCategory("Animation", FText::GetEmpty(), ECategoryPriority::Important); |
ここまでくると独自でカスタマイズしない限り、順番には干渉できません。
できる範囲でカテゴリ順をいい感じにする
①埋もれないようにする基本テクニック
1.Componentプロパティをクラス先頭に置かないようにする
そのあとの独自カテゴリよりもComponentが内部に持っているカテゴリとプロパティが先に表示されてしまいます。
2.Blueprintに公開されるプロパティを先頭に置く
カテゴリ最初のプロパティがBlueprintReadOnly、BlueprintReadWriteでないとカテゴリの優先順位が低くなります。
3.AdvancedDisplayが含まれているプロパティのみにしない
カテゴリ内が「AdvancedDisplay」が含まれているプロパティのみだと、普通のプロパティを含んでいるカテゴリよりも優先順位が低くなります。
②クラス指定子について
1.PrioritizeCategoriesはそのクラスが持つカテゴリだけ
カテゴリの優先順位を操作するクラス指定子の「PrioritizeCategories」は、最初のカテゴリ収集時に適用されるため、そのあとに展開されるComponent内部のカテゴリには影響されません。
2.HideCategoriesはそのクラスが持つカテゴリだけ
カテゴリを非表示にできるクラス指定子の「HideCategories」は、最初のカテゴリ収集の範囲内のカテゴリが対象です。Componentにしか存在しないカテゴリは非表示にできません。
例として、StaticMeshComponentのStaticMeshカテゴリはActor側でHideCategoriesしても非表示にはできません。
AMyCharacterを改善してみる
先ほどのAMyCharacterはStaticMeshComponentプロパティが先頭にいることで悪さをしているので、下に移動させましょう。
|
|
UCLASS() class MYPROJECT_API AMyCharacter : public ACharacter { GENERATED_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MyProject") bool bBoolProperty; UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "MyProject") int32 IntProperty; // 一番下に移動 UPROPERTY(VisibleAnywhere, Category = "MyProject") TObjectPtr StaticMeshComponent; }; |

ただ、Transform、StaticMesh、Animation、Meshはエンジン側がカスタマイズで意図的にカテゴリの優先順位を上げているため、これ以上はこのままでは上げられません。
Detailsパネルのカスタマイズ
Detailsパネルのカテゴリやプロパティを追加や編集することができる機能です。
エンジンのカスタマイズを上書きしたい場合はこの機能を使用する必要があります。
様々なことができる機能ですが、さわりとして登録手順とカテゴリに関しての機能をご紹介します。
※本機能はエディタ機能のため、エディタモジュール内での実装となります。
エディタモジュールの追加方法については、本記事では割愛させていただきます。
①登録手順
今回はAMyCharacterクラスのDetailsパネルをカスタマイズします。
1.IDetailCustomizationを継承したクラスを作成
|
|
#pragma once #include "IDetailCustomization.h" #include "Templates/SharedPointer.h" class FMyCharacterDetails : public IDetailCustomization { public: /** Makes a new instance of this detail layout class for a specific detail view requesting it */ static TSharedRef MakeInstance(); /** IDetailCustomization interface */ virtual void CustomizeDetails(IDetailLayoutBuilder& DetailLayout) override; }; |
|
|
#include "MyCharacterDetails.h" #include "DetailLayoutBuilder.h" TSharedRef FMyCharacterDetails::MakeInstance() { return MakeShareable(new FMyCharacterDetails); } void FMyCharacterDetails::CustomizeDetails(IDetailLayoutBuilder& DetailLayout) { // ここに処理を記述する } |
2.FMyCharacterDetailsの登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
#include "Modules/ModuleManager.h" #include "PropertyEditorModule.h" #include "MyCharacterDetails.h" void FMyProjectEditorModule::StartupModule() { // PropertyEditorモジュールの取得 FPropertyEditorModule& PropertyModule = FModuleManager::GetModuleChecked("PropertyEditor"); // 処理順番を最後にしたいのでOrderを9999に設定 FRegisterCustomClassLayoutParams ClassLayoutParams; ClassLayoutParams.OptionalOrder = 9999; // MyCharacterクラスに紐づくように登録 PropertyModule.RegisterCustomClassLayout("MyCharacter", FOnGetDetailCustomizationInstance::CreateStatic(&FMyCharacterDetails::MakeInstance), ClassLayoutParams); } void FMyProjectEditorModule::ShutdownModule() { // 登録を解除 FPropertyEditorModule& PropertyModule = FModuleManager::GetModuleChecked("PropertyEditor"); PropertyModule.UnregisterCustomClassLayout("MyCharacter"); } |
②カテゴリの操作機能
1.カテゴリ順の操作
EditCategory関数を使用することでCategoryの編集を行うことができます。
引数としてECategoryPriorityを設定してカテゴリ順を変えることが可能です。
|
|
void FMyCharacterDetails::CustomizeDetails(IDetailLayoutBuilder& DetailLayout) { // Transformカテゴリの下になるようにPriorityを設定 DetailLayout.EditCategory(TEXT("MyProject"), FText::GetEmpty(), ECategoryPriority::Transform); } |

2.カテゴリを非表示にする
HideCategory関数を使用してカテゴリを非表示にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
void FMyCharacterDetails::CustomizeDetails(IDetailLayoutBuilder& DetailLayout) { // TransformとMyProjectだけ表示させたい TArray VisibleCategoryNames = {"Transform", "MyProject"}; // 表示されるカテゴリ名をすべて取得 TArray CategoryNames; DetailLayout.GetCategoryNames(CategoryNames); for (const FName& CategoryName : CategoryNames) { // 対象の名前が含まれているかチェック bool bResult = Algo::AnyOf(VisibleCategoryNames, [&](const FString& Key) { return CategoryName.ToString().Contains(Key); }); // 対象の名前が含まれていなかったら非表示 if (!bResult) { DetailLayout.HideCategory(CategoryName); } } } |

カテゴリ周りを少し整えるだけで、Details パネルの利便性は大きく向上します。
改めて意識していきたいです。