背景
元々UnityエンジニアをしていてUnityではMVPパターンという設計がよく使われているという個人的感触がありました。そこでUEFNも似たような環境なのでMVPを利用すれば実装しやすくなるのではと考えてやってみることにしました。
MVPとは
MVPパターンとは、Model-View-Presenterの略で、Model(パラメータなどの値を持つクラス)とView(画面の表示, 入力などを行うクラス)の間にPresenterを挟むことで、
ViewとModelの依存関係をなくすことができるデザインパターンです。
とても参考になる記事↓
https://qiita.com/toRisouP/items/5365936fc14c7e7eabf9
実装
モデルクラス
単純なパラメータを持つクラスになります。Initialize
で一秒に一回countを追加する実装をしています。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
sample_model := class:
var count : int = 0
GetCount<public>():int=
return count
Initialize<public>()<suspends>:void=
loop:
Sleep(1.0)
set count +=1
Viewクラス
billboard_device
のテキストをただ更新する機能を入れています。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
sample_view_device := class(creative_device):
@editable
Text:billboard_device=billboard_device{}
TextMessage<localizes>(msg:string):message="{msg}"
SetText<public>(value:int):void=
Text.SetText(TextMessage("Now Count : {value}"))
プレゼンタークラス
OnBegin
でModelクラスの初期化とViewのアップデート処理を実行しています。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
sample_presenter_device := class(creative_device):
@editable
View:sample_view_device=sample_view_device{}
Model:sample_model = sample_model{}
OnBegin<override>()<suspends>:void=
spawn { Model.Initialize() }
spawn { Update() }
Update()<suspends>:void=
loop:
Sleep(0.1)
count:=Model.GetCount()
View.SetText(count)
Verce初心者のための豆知識
spawn { Model.Initialize() }
spawn { Update() }
なぜspawnしているの?と思いますよね。
この理由は両方の関数共に<suspends>
というエフェクトがついています。また、中でloop
を実行していますよね。suspendsを付けるとその関数の中身が全て実行し終わるまで次の関数を実行させないという並列処理
にさせるものであります。
つまり今回の件で見ると両方の関数共にloop
が入っておりゲームが終了しない限り関数の中身が終了しないということになります。そこでspawn
をつけて呼ぶことで次の関数を実行できるようにしているわけです。
実行結果
まとめ
意外とすんなりMVPへ落とし込むことができました。今回は利用しませんでしたがコンストラクタなども使えるみたいなのでもっと良いコードが書けるのかなとおもいました。本当はUIでMVPを表現したかったのですがUIの実装がなかなか厄介なので今回はやめました。12月中に実装方法の記事を書いていこうと思います。
余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。