UE4 自定义object属性面板 class面板

 

一.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

具体工程看链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值