78 lines
2.7 KiB
Markdown
Raw Normal View History

2024-10-12 17:19:46 +08:00
# PinHiddenByDefault
- **功能描述:** 使得这个结构里的属性在蓝图里作为引脚时默认是隐藏的。
- **使用位置:** UPROPERTY
- **引擎模块:** Pin
- **元数据类型:** bool
- **限制类型:** struct member property
- **常用程度:** ★★
使得这个结构里的属性在蓝图里作为引脚时默认是隐藏的。
需要注意的是这个meta只作用于结构的成员属性且只作用在蓝图里的节点。在有些时候一个结构里拥有多个属性但不是希望一下子暴露所有属性来让用户编辑有些属性可能是高级属性需要一开始隐藏起来。
该标记也可以在动画蓝图中,让动画节点的某些属性不暴露成引脚。
## 测试代码:
```cpp
USTRUCT(BlueprintType)
struct FMyPinHiddenTestStruct
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite,Category=PinHiddenByDefaultTest)
int32 MyInt_NotHidden = 123;
UPROPERTY(EditAnywhere, BlueprintReadWrite,Category=PinHiddenByDefaultTest, meta = (PinHiddenByDefault))
int32 MyInt_PinHiddenByDefault = 123;
};
UFUNCTION(BlueprintCallable)
static FMyPinHiddenTestStruct MyHiddenPinTestFunc(FMyPinHiddenTestStruct Input);
```
## 测试结果:
可以发现MakeStruct和BreakStruct的节点默认只有MyInt_NotHidden。当选择该蓝图节点时可以在右侧细节面板看到MyInt_PinHiddenByDefault 的显示默认没有选中,这就是区别。
同样的当该结构当作函数输入和输出参数的时候当用SplitStuctPin展开结构节点会发现MyInt_PinHiddenByDefault 也被隐藏了起来。
![Untitled](Untitled.png)
## 原理:
通过源码可以发现FStructOperationOptionalPinManager 里使用了该meta然后FMakeStructPinManager 和FBreakStructPinManager 继承了从而使得PinHiddenByDefault的Pin一开始不显示。
```cpp
struct FStructOperationOptionalPinManager : public FOptionalPinManager
{
//~ Begin FOptionalPinsUpdater Interface
virtual void GetRecordDefaults(FProperty* TestProperty, FOptionalPinFromProperty& Record) const override
{
Record.bCanToggleVisibility = true;
Record.bShowPin = true;
if (TestProperty)
{
Record.bShowPin = !TestProperty->HasMetaData(TEXT("PinHiddenByDefault"));
if (Record.bShowPin)
{
if (UStruct* OwnerStruct = TestProperty->GetOwnerStruct())
{
Record.bShowPin = !OwnerStruct->HasMetaData(TEXT("HiddenByDefault"));
}
}
}
}
virtual void CustomizePinData(UEdGraphPin* Pin, FName SourcePropertyName, int32 ArrayIndex, FProperty* Property) const override;
// End of FOptionalPinsUpdater interfac
};
struct FMakeStructPinManager : public FStructOperationOptionalPinManager
{}
struct FBreakStructPinManager : public FStructOperationOptionalPinManager
{}
```