C++とWBP間のUI契約
BindWidgetでアクションとデザインを分離する
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
Unreal UIをC++で作っても、Widget Blueprintを全部なくす必要はない。 ProjectTBではC++が動作を担当し、WBPはレイアウトとスタイルを担当する契約に分けた。
BindWidgetは名前契約です
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UTextBlock> UnitNameText;
UPROPERTY(meta = (BindWidgetOptional))
TObjectPtr<UButton> SettingsButton;
WBP内に同じ名前と互換性のあるタイプのウィジェットがある場合、自動的にリンクされます。 BindWidgetは必ず存在しなければならず、BindWidgetOptionalはなくてもC ++の生成は失敗しません。
徐々にUIを修正するプロジェクトなら、Optional契約が役に立つ。 代わりに、C++でポインタを使用する前に必ずチェックする必要があります。
if (UnitNameText)
{
UnitNameText->SetText(Unit->GetDisplayName());
}
WBP がデータを引き続き Polling しないようにする
TickごとにWBPがGameModeを見つけて体力とお金を読むようにすると、データフローを追跡するのは難しい。 C ++の状態が変わる時点でWidgetの更新関数を呼び出すほうが明らかです。
戦闘状態の変更
↓
C++ 検証完了
↓
RefreshBattleState()
↓
関連付けられたTextBlockの更新
契約書を一緒に置く
ProjectTBのWBP_MainHUD_Contract.mdにSelectionSwitcher, HoverUnitNameText, TimelineText同じ正確な名前とタイプが書かれている。 WBPワーカーは、C ++全体を読むことなくどのウィジェットを作成するべきかを知ることができます。
C ++とBlueprintの間の問題はどちらが良いかではありません。 名前、タイプ、呼び出し方向、なくてもよいウィジェットを指定しなかったときに問題が生じる。