结构体如下:
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。