58 lines
1.9 KiB
Markdown
58 lines
1.9 KiB
Markdown
|
# BindWidgetOptional
|
|||
|
|
|||
|
- **功能描述:** 指定在C++类中该Widget属性可以绑定到UMG的某个同名控件,也可以不绑定。
|
|||
|
- **使用位置:** UPROPERTY
|
|||
|
- **引擎模块:** Widget Property
|
|||
|
- **元数据类型:** bool
|
|||
|
- **限制类型:** UWidget子类里属性
|
|||
|
- **关联项:** [BindWidget](../BindWidget/BindWidget.md)
|
|||
|
- **常用程度:** ★★★
|
|||
|
|
|||
|
指定在C++类中该Widget属性可以绑定到UMG的某个同名控件,也可以不绑定。
|
|||
|
|
|||
|
大致作用和BindWidget一样,区别是:
|
|||
|
|
|||
|
- BindWidgetOptional顾名思义是可选的,意思是UMG里即使不定义该控件在编译的时候也不会报错。编译会通过,但是会提示警告缺少控件。
|
|||
|
-
|
|||
|
- 和不加BindWidgetOptional的控件同名属性的区别是,前者在UMG里定义同名控件的时候不会报错,但后者是会提示同名冲突报错。
|
|||
|
|
|||
|
BindWidgetOptional的写法有两种:
|
|||
|
BindWidgetOptional可以看作是BindWidget和OptionalWidget的合并版。
|
|||
|
|
|||
|
```cpp
|
|||
|
UCLASS(BlueprintType)
|
|||
|
class INSIDER_API UMyProperty_BindWidget :public UUserWidget
|
|||
|
{
|
|||
|
GENERATED_BODY()
|
|||
|
|
|||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
|||
|
class UTextBlock* MyTextBlock_SameName;
|
|||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidgetOptional))
|
|||
|
class UTextBlock* MyTextBlock_Optional1;
|
|||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (BindWidget, OptionalWidget))
|
|||
|
class UTextBlock* MyTextBlock_Optional2;
|
|||
|
};
|
|||
|
```
|
|||
|
|
|||
|
## 测试效果:
|
|||
|
|
|||
|

|
|||
|
|
|||
|
## 原理:
|
|||
|
|
|||
|
```cpp
|
|||
|
|
|||
|
bool FWidgetBlueprintEditorUtils::IsBindWidgetProperty(const FProperty* InProperty, bool& bIsOptional)
|
|||
|
{
|
|||
|
if ( InProperty )
|
|||
|
{
|
|||
|
bool bIsBindWidget = InProperty->HasMetaData("BindWidget") || InProperty->HasMetaData("BindWidgetOptional");
|
|||
|
bIsOptional = InProperty->HasMetaData("BindWidgetOptional") || ( InProperty->HasMetaData("OptionalWidget") || InProperty->GetBoolMetaData("OptionalWidget") );
|
|||
|
|
|||
|
return bIsBindWidget;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
```
|