1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UEFN / VerseAdvent Calendar 2023

Day 5

【UEFN】VerseでMVPパターンを表現してみる

Posted at

背景

元々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に関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?