VContainerを触ってみた。その2,MVPパターン (Unity初心者)

 前回まで

公式リファレンスのHello Worldをやりながら自分なりにまとめた。

<<前回


今回

前回のボタンを持ったViewにTextを追加して、ボタンを押すたびにViewのTextの数字を増やしていく仕様を作った。

MVPパターンでやってみる。

前回作ったクラスに追加していく形にする。

VContainerのテストなのでUniRxとかは使わずにやってみる。


①HelloScreen(View)にTextを追加。

シーンにTextを追加して、HelloScreen(View)にTextコンポーネントの参照を追加。

またテキストを更新する処理を作った。


public class HelloScreen : MonoBehaviour
{
    public Button HelloButton;
    public Text countText; //追加

    public void UpdateText(int _count) //数字を引数にその数字にテキストを変更
    {
        countText.text = _count.ToString();
    }
}


②CountUpModel(Model)を作成。

ボタンを押すたびにカウントを上げるので、今のカウントとそのカウントを上げる処理を実装したCountUpModel(Model)を作成した。


public class CountUpModel
{
    int nowCount; //現在のカウント
    public int NowCount => nowCount;
    public CountUpModel()
    {
        nowCount = 0;
    }
    public void CountUp() //カウントを増やす
    {
        nowCount ++;
    }
}


③GamePresenter(Presenter)に先ほど作ったCountUpModel(Model)のフィールドを作成。

Presenterに注入するModelのフィールドを作成。

IStartable.Start()でViewのボタンにAddListenerでModelの処理を追加。Viewのテキストを更新する処理もここで入れちゃう。

(もっと厳密にViewとModelを切り離すなら、Viewのボタンをpublicで開くのではなくて、event ActionでボタンのイベントをPresenterで注入する形の方がいいかも。もっと言えばUniRxでボタンのイベントを購読する形がいい。今回はVContainerのテストなのでしない。)


public class GamePresenter : IStartable
{
    readonly HelloWorldService helloWorldService;
    readonly HelloScreen helloScreen;
    readonly CountUpModel countUpModel; //追加

    public GamePresenter(HelloWorldService helloWorldService, HelloScreen helloScreen, CountUpModel countUpModel)
    {
        this.helloWorldService = helloWorldService;
        this.helloScreen = helloScreen;
        this.countUpModel = countUpModel;
    }

    public void Start()
    {
        helloScreen.HelloButton.onClick.AddListener(()=>{
            countUpModel.CountUp(); //Modelのカウントを増やす
            helloScreen.UpdateText(countUpModel.NowCount); //ModelからnowCountを引数にテキスト更新
        });
    }
}


④GameLifetimeScopeでCountUpModelをDIコンテナに登録する。


public class GameLifetimeScope : LifetimeScope
{
    [SerializeField] HelloScreen helloScreen;

    protected override void Configure(IContainerBuilder builder)
    {
        builder.Register<HelloWorldService>(Lifetime.Singleton);

        //MVP
        builder.Register<CountUpModel>(Lifetime.Singleton); //追加
        builder.RegisterEntryPoint<GamePresenter>();
        builder.RegisterComponent(helloScreen);

    }
}


HelloScreen(View)のインスペクターにTextをアタッチして、実行して確認する。

ボタンを押すたびにテキストのカウントが増えたら成功!





まとめ

以上でMVPパターンでのVContainerの実装の流れは掴んだ気がする。

普段UniRx等でMVPパターンの実装を行なっていたりするけど、シーンのGameObjectにアタッチしたPresenterにViewやModelをアタッチするのがなんか釈然としなかった。結局ここで参照するならもういっぺんに書けばいんじゃね?とか思ってたり😓

でも今回、VContainerでの依存性注入でPresenterのViewやModelの依存を外部から注入することができるようになったので、その釈然としなかったことが改善された。特に自分の中ではPresenterにViewなどの参照を渡すためにGameObjectにアタッチしないといけないのをしなくていいのは大きい気がする。

次はGameObjectの移動のInputの入力をVContainerの依存性注入を変えることによって、違うInputを注入する方法をやっていく。


次回

VContainerを触ってみた。その3,注入するInputの変更 (Unity初心者)


参考にさせていただいた記事等🙏

【Unity】VContainerの使用例(MVPパターン)



コメント