自定义Struct的Detail界面

结构体如下:

USTRUCT(BlueprintType)
struct FPaladinNPCPatrolActionInfo
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	EPaladinNPCActionType ActionType;

	//ActionType为GotoTarget的时候生效,指向NPC需要移动的哪个位置
	UPROPERTY(EditAnywhere, BlueprintReadWrite ,meta = (EnumCondition = 0))
	AActor* targetActor;
	//ActionType为GotoTarget的时候生效,移动到指定位置需要的时间,单位为秒,默认为1.5秒
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EnumCondition = 0))
	float gotoTime = 1.5f;
	//ActionType为Montage的时候生效,指定多个蒙太奇动画
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EnumCondition = 1))
	TArray<UAnimMontage*> Montages;
	//ActionType为AnimSequences的时候生效,可以指定多个AnimSequence
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EnumCondition = 2))
	TArray<UAnimSequence*> AnimSequences;
	//ActionType为Custom的时候生效,Key为人物ID,Value是指定的自定义结构信息
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (EnumCondition = 3))
	TMap<FName, FPaladinNPCCustomEvent> CustomMap;
};

当ActionType为0的时候我们希望仅仅显示属性targetActor和gotoTime,当ActionType为1的时候仅显示Montages....

但是默认的属性界面是所有属性都显示出来,那么我们需要自定义该界面:

1. 创建编辑器插件,在StartupModule调用:

FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked<FPropertyEditorModule>("PropertyEditor");
PropertyModule.RegisterCustomPropertyTypeLayout("PaladinNPCPatrolActionInfo", FOnGetPropertyTypeCustomizationInstance::CreateStatic(&FPaladinNPCPatrolActionInfoCustomization::MakeInstance));

2. 新建h和cpp文件如下:

class FPaladinNPCPatrolActionInfoCustomization
	: public IPropertyTypeCustomization
{
public:
	static TSharedRef<IPropertyTypeCustomization> MakeInstance();

	FPaladinNPCPatrolActionInfoCustomization()
	{ }

	virtual ~FPaladinNPCPatrolActionInfoCustomization() {}

	/** Begin IPropertyTypeCustomization interface */
	virtual void CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils) override {}
	virtual void CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override;
	/** End IPropertyTypeCustomization interface */
protected:
	EVisibility ArePropertiesVisible(const int32 VisibleType) const;
	TSharedPtr<IPropertyHandle> EnumProperty;
};
TSharedRef<IPropertyTypeCustomization> FPaladinNPCPatrolActionInfoCustomization::MakeInstance()
{
	return MakeShareable(new FPaladinNPCPatrolActionInfoCustomization());
}

void FPaladinNPCPatrolActionInfoCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
	uint32 NumChildren;
	StructPropertyHandle->GetNumChildren(NumChildren);
	FString Name = StructPropertyHandle->GetPropertyDisplayName().ToString();
	IDetailGroup& Group = StructBuilder.AddGroup(FName(*Name), FText::FromString(Name));

	for (uint32 ChildIndex = 0; ChildIndex < NumChildren; ++ChildIndex)
	{
		TSharedRef<IPropertyHandle> ChildHandle = StructPropertyHandle->GetChildHandle(ChildIndex).ToSharedRef();
		//IDetailPropertyRow& Property = StructBuilder.AddProperty(ChildHandle);

		IDetailPropertyRow& Property = Group.AddPropertyRow(ChildHandle);

		if (ChildHandle->GetProperty()->GetFName() == "ActionType")
		{
			EnumProperty = ChildHandle;
		}
		else
		{
			static const FName EditConditionName = "EnumCondition";
			int32 EnumCondition = ChildHandle->GetINTMetaData(EditConditionName);
			Property.Visibility(TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateSP(this, &FPaladinNPCPatrolActionInfoCustomization::ArePropertiesVisible, EnumCondition)));
		}

	}
}

EVisibility FPaladinNPCPatrolActionInfoCustomization::ArePropertiesVisible(const int32 VisibleType) const
{
	uint8 CurrentEnumValue = 0;
	EnumProperty->GetValue(CurrentEnumValue);
	return (CurrentEnumValue == VisibleType) ? EVisibility::Visible : EVisibility::Collapsed;
}

End。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值