一.Object面板自定义
最终自定义效果
没有使用自定义 由引擎默认生成的面板
主要是分为两步1.自定义类并继承IPropertyTypeCustomization 重写里面的CustomizeHeader和CustomizeChildren 函数
其中Header就是上图中NewVar0部分 Children就是TempA部分 ,具体使用SLate方式进行绘制
.h文件
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "IPropertyTypeCustomization.h"
#include "PropertyHandle.h"
#include "MyStructCustomization.generated.h"
/**
*
*/
USTRUCT(BlueprintType)
struct TESTFORCUSTOMDETAIL_API FMyStruct
{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere)
int32 TempA;
};
class TESTFORCUSTOMDETAIL_API FMyStructCustomization : public IPropertyTypeCustomization
{
public:
static TSharedRef<IPropertyTypeCustomization> MakeInstance();
virtual void CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils);
virtual void CustomizeChildren(TSharedRef<IPropertyHandle> PropertyHandle, IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& CustomizationUtils);
private:
TSharedPtr<IPropertyHandle> Handler;
};
.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyStructCustomization.h"
#include "DetailWidgetRow.h"
#include "DetailLayoutBuilder.h"
#define LOCTEXT_NAMESPACE "MyStructCustomization"
TSharedRef<IPropertyTypeCustomization> FMyStructCustomization::MakeInstance()
{
return MakeShareable(new FMyStructCustomization());
}
void FMyStructCustomization::CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, FDetailWidgetRow & HeaderRow, IPropertyTypeCustomizationUtils & CustomizationUtils)
{
uint32 NumChildren;
PropertyHandle->GetNumChildren(NumChildren);
for (uint32 ChildIndex = 0; ChildIndex < NumChildren; ChildIndex++)
{
const TSharedRef<IPropertyHandle> ChildHandler = PropertyHandle->GetChildHandle(ChildIndex).ToSharedRef();
if (ChildHandler->GetProperty()->GetName() == TEXT("TempA"))
{
Handler = ChildHandler;
}
}
check(Handler.IsValid());
HeaderRow.NameContent()
[
PropertyHandle->CreatePropertyNameWidget(LOCTEXT("Name", "HeaderRowName"), LOCTEXT("Tip", "HeaderTip"), false)
]
.ValueContent()
.MinDesiredWidth(500)
[
SNew(STextBlock)
.Text(LOCTEXT("info", "Property value"))
.Font(IDetailLayoutBuilder::GetDetailFont())
];
}
void FMyStructCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> PropertyHandle, IDetailChildrenBuilder & ChildBuilder, IPropertyTypeCustomizationUtils & CustomizationUtils)
{
}
#undef LOCTEXT_NAMESPACE
2.找到一个合适的位置调用RegisterCustomPropertyTypeLayout 将你自定义的类型与propertytype联系起来
这里我是在工程的默认GameModule中进行注册
// Fill out your copyright notice in the Description page of Project Settings.
#include "TestForCustomDetail.h"
#include "Modules/ModuleManager.h"
#include "PropertyEditorModule.h"
#include "MyStructCustomization.h"
IMPLEMENT_PRIMARY_GAME_MODULE(FTestForCustomDetail, TestForCustomDetail, "TestForCustomDetail" );
#define LOCTEXT_NAMESPACE "TestForCustomDetail"
void FTestForCustomDetail::StartupModule()
{
FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
PropertyModule.RegisterCustomPropertyTypeLayout("MyStruct", FOnGetPropertyTypeCustomizationInstance::CreateStatic(&FMyStructCustomization::MakeInstance));
}
#undef LOCTEXT_NAMESPACE
官方的可以参考类似FSlateBrush 对应 SlateBrushCustomization
二.自定义Class面板
默认
自定义的
自定义class面板的步骤大致与struct一致
1.定义继承自IDetailCustomization 的类 重写Customizetails
.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "IDetailCustomization.h"
/**
*
*/
class TESTFORCUSTOMDETAIL_API FMyClassCustomization: public IDetailCustomization
{
public:
static TSharedRef<IDetailCustomization> MakeInstance();
virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;
};
.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyClassCustomization.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "DetailWidgetRow.h"
#define LOCTEXT_NAMESPACE "MyClassCustomization"
TSharedRef<IDetailCustomization> FMyClassCustomization::MakeInstance()
{
return MakeShareable(new FMyClassCustomization());
}
void FMyClassCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
IDetailCategoryBuilder& TestCategory = DetailBuilder.EditCategory("TestName", LOCTEXT("Title", "Category Name"), ECategoryPriority::Important); //定义名称还有插入的位置
//具体的Slate内容
TestCategory.AddCustomRow(LOCTEXT("Row", "Test Name"))
.NameContent()
[
SNew(STextBlock)
.Text(LOCTEXT("Name", "Name"))
.Font(IDetailLayoutBuilder::GetDetailFont())
]
.ValueContent().MinDesiredWidth(700)
[
SNew(STextBlock)
.Text(LOCTEXT("Value", "Value"))
.Font(IDetailLayoutBuilder::GetDetailFont())
];
TestCategory.AddCustomRow(LOCTEXT("Row", "Test Name"))
.NameContent()
[
SNew(STextBlock)
.Text(LOCTEXT("Name1", "Name1"))
.Font(IDetailLayoutBuilder::GetDetailFont())
]
.ValueContent().MinDesiredWidth(700)
[
SNew(STextBlock)
.Text(LOCTEXT("Value1", "Value1"))
.Font(IDetailLayoutBuilder::GetDetailFont())
];
}
#undef LOCTEXT_NAMESPACE
2.调用RegisterCustomClassLayout 将创建的class与自定义的面板进行联系
PropertyModule.RegisterCustomClassLayout("MyActorClass", FOnGetDetailCustomizationInstance::CreateStatic(&FMyClassCustomization::MakeInstance));
官方可以参考StaticMeshComponentDetails
具体工程看链接