看完能得到什么?
对自定义资源的细节面板进行自定义!
我们之前创建的自定义资源实际上是自带了细节面板的,我们可以对这个面板进行自定义,旧面板如下
新面板如下
1、自定义细节面板
#pragma once
#include "CoreMinimal.h"
#include "IDetailCustomization.h"
class FSimpleAnimationAssetDetailCustomization : public IDetailCustomization
{
public:
virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;
private:
FReply OnBtnClicked();
};
该类需要继承IDetailCustomization,并且重写CustomizeDetails方法,该方法记录了细节面板UI展示相关的东西
#include "Detail/SimpleAnimationAssetDetailCustomization.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#include "DetailWidgetRow.h"
#include "PropertyCustomizationHelpers.h"
#include "SimpleAnimationAsset.h"
void FSimpleAnimationAssetDetailCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
IDetailCategoryBuilder& DetailCategoryBuilderInstance = DetailBuilder.EditCategory(TEXT("SimpAnimCategory"));
TSharedPtr<IPropertyHandle> SimpleAnimationAssetIntValueProperty = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(USimpleAnimationAsset, IntValue));
DetailBuilder.AddPropertyToCategory(SimpleAnimationAssetIntValueProperty);
DetailCategoryBuilderInstance
.AddCustomRow(FText::FromString(TEXT("SimpAnimCustomRow")))
.WholeRowContent()
[
SNew(SProperty, SimpleAnimationAssetIntValueProperty)
.ShouldDisplayName(false)
.CustomWidget()
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.VAlign(VAlign_Center)
[
SNew(SButton)
.ToolTipText(FText::FromString("this is a button"))
.OnClicked(this, &FSimpleAnimationAssetDetailCustomization::OnBtnClicked)
]
+ SHorizontalBox::Slot()
.VAlign(VAlign_Center)
.HAlign(HAlign_Right)
.Padding(4.0f, 0.0f)
.FillWidth(1.0f)
[
SNew(STextBlock)
.Text_Lambda(
[SimpleAnimationAssetIntValueProperty]
{
int32 Value;
SimpleAnimationAssetIntValueProperty->GetValue(Value);
return FText::FromString(FString::FromInt(Value));
}
)
]
+ SHorizontalBox::Slot()
.Padding(0.0f, 0.0f)
.VAlign(VAlign_Center)
.FillWidth(1.0f)
[
SNew(STextBlock).Text(FText::FromString("number"))
]
]
];
}
FReply FSimpleAnimationAssetDetailCustomization::OnBtnClicked()
{
return FReply::Handled();
}
2、绑定该自定义细节面板
在SimpleAnimationAssetEditorModule中添加如下几行代码,将自定义细节面板绑定,SimpleAnimationAssetEditor插件的模块类,用于控制该插件的生命周期内各个时期的函数调用等,
详细可见Unreal 自定义编辑器(四)
至此,我们的自定义细节面板已经完成,我们也可以对细节面板内的任意属性进行自定义,需要对要自定义的属性继承IPropertyTypeCustomization,并在SimpleAnimationAssetEditorModule中进行对应属性的绑定
#include "IPropertyTypeCustomization.h"
class FSimpleAnimationAssetStrCustomization : public IPropertyTypeCustomization
{
public:
virtual void CustomizeHeader(
TSharedRef<IPropertyHandle> InPropertyHandle,
FDetailWidgetRow& HeaderRow,
IPropertyTypeCustomizationUtils& CustomizationUtils) override;
virtual void CustomizeChildren(
TSharedRef<IPropertyHandle> InPropertyHandle,
IDetailChildrenBuilder& ChildBuilder,
IPropertyTypeCustomizationUtils& CustomizationUtils) override;
};
上述代码的具体实现没有给出,可以自行进行尝试
virtual void StartupModule() override
{
{
IAssetTools& AssetTools = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
Action = MakeShareable(new FSimpleAnimationAssetAction());
AssetTools.RegisterAssetTypeActions(Action.ToSharedRef());
}
FPropertyEditorModule& PropertyEditorModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
PropertyEditorModule.RegisterCustomPropertyTypeLayout("str", FOnGetPropertyTypeCustomizationInstance::CreateLambda(
[] {return MakeShareable(new FSimpleAnimationAssetStrCustomization); }
));
PropertyEditorModule.RegisterCustomClassLayout("SimpleAnimationAsset", FOnGetDetailCustomizationInstance::CreateLambda(
[] {return MakeShareable(new FSimpleAnimationAssetDetailCustomization); }
));
PropertyEditorModule.NotifyCustomizationModuleChanged();
}
Unreal 自定义编辑器(一)
Unreal 自定义编辑器(二)
Unreal 自定义编辑器(三)
Unreal 自定义编辑器(四)
Unreal 自定义编辑器(五)
Unreal 自定义编辑器(六)