← SEARCHABLE ARCHIVE
Unreal Engine · 2026-07-02

C++ 和 WBP 之间的 UI 契约

使用 BindWidget 将行为和设计分开

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

仅仅因为您使用 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 之间的问题不在于哪个更好。 当不指定不需要删除的名称、类型、调用方向和小部件时,就会出现问题。