C++ 和 WBP 之间的 UI 契约
使用 BindWidget 将行为和设计分开
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
仅仅因为您使用 C++ 创建 Unreal UI,就没有必要完全消除 Widget Blueprint。 在ProjectTB中,它被分为契约,C++负责操作,WBP负责布局和样式。
BindWidget是一个命名契约
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UTextBlock> UnitNameText;
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> SettingsButton;
如果WBP中存在同名且类型兼容的widget,则会自动连接。 BindWidget必须存在,BindWidgetOptional即使没有 ,C++ 生成也不会失败。
可选合约对于逐渐修改 UI 的项目很有用。 相反,在 C++ 中使用指针之前必须检查它们。
if (UnitNameText)
{
UnitNameText->SetText(Unit->GetDisplayName());
}
防止 WBP 持续轮询数据
如果每个刻度都导致 WBP 查找 GameMode 并读取生命值和金钱,则很难跟踪数据流。 显然,当C++状态发生变化时,最好调用Widget的更新函数。
改变战斗状态
↓
C++ 已验证
↓
RefreshBattleState()
↓
更新链接的 TextBlock
将合同文件放在一起
TB 计划WBP_MainHUD_Contract.md在SelectionSwitcher, HoverUnitNameText, TimelineText写入的名称和类型完全相同。 WBP 工作人员无需阅读所有 C++ 内容即可知道要创建哪些小部件。
C++ 和 Blueprint 之间的问题不在于哪个更好。 当不指定不需要删除的名称、类型、调用方向和小部件时,就会出现问题。