UE5.5 + MVVM でキャラに追従するUIを作成する
UE5.5におけるMVVM
MVVMは「Model/View/ViewModel」という内部構造を持ち、UIの描画処理とロジックを分離するGUIアーキテクチャです。Model → ViewModel の状態変更に同期してViewの状態(UI)が更新されます。[1] この際、ViewはViewModelの保持する値をバインディングして、値の変更があった際はUIの更新を行います。こうすることでUIとロジックの実装が疎になるメリットがあります。「Model → ViewModel → View」だけでなく、「View → ViewModel → Model」という逆方向もあり、双方向的です。
Unreal Engine の公式ドキュメントでは、「Model(大体Actor)」「View(UMG)」「ViewModel(ViewModel)」の例で紹介されています。[2]
UE5.5においてMVVMの実装を行う(BP)
-
「UMG ViewModel」というプラグインをONにする
-
「MVVMViewModelBase」を継承したBP「BP_ViewModelExample」を作成します
-
「View」に当たるWidgetBPを開き、「ウィンドウ>バインディングを表示」を選択
-
「ウィジェットを追加」から「BP_ViewModelExample」で保持している値の変更に応じて、表示を更新したいウィジェットを選択します(HPの更新ならばHPゲージのWidgetなど)
この際、ViewModel側で保持している変数は「ベル」を選択してView側へ変更通知を可能にしておく必要があります。
-
Modelに当たるアクタに「BP_ViewModelExample」の参照を持たせる
-
アクタのロジックの更新時は、「BP_ViewModelExample」で保持している値に変更を通知するようにします(アクタのHP減少 → ViewModelで保持するHP変数に通知)
上記がMVVM実装の基本の流れです。
MVVMを用いてアクタの位置にUIを追従させる
さて上記を踏まえたうえで、アクタに追従したUI表示を行う方法が以下です。ベストプラクティスではないと思いますが、一例として。
- アクタのOnBeginPlayでViewModelを生成→「BP_ViewModelExample」の参照を持たせます
- 毎Tick「GetActorLocation → Project World Location to Widget Position」を呼び出し、ViewModel側へ通知する
UIの追従検証動画
移動しているユニットに対してUIが追従していってるのがわかります。(動画0:05~ 辺り: 縦に3つ出てくるUIがそれです)
Discussion