← 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 之間的問題不在於哪個比較好。 當不指定不需要刪除的名稱、類型、呼叫方向和小部件時,就會出現問題。