facebook twitter hatena line email

「Unity/MVP」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(手順)
行54: 行54:
 
{
 
{
 
     [SerializeField] private CounterView _counterView;
 
     [SerializeField] private CounterView _counterView;
 +
    private CounterModel _counterModel;
  
 
     void Start()
 
     void Start()
 
     {
 
     {
         CounterModel model = new CounterModel();
+
         _counterModel = new CounterModel();
         _counterView.SetValueText(model.Counter);
+
         _counterView.SetValueText(_counterModel.Counter);
  
 
         _counterView.plusButton
 
         _counterView.plusButton
 
             .OnClickAsObservable()
 
             .OnClickAsObservable()
 
             .Subscribe(_ => {
 
             .Subscribe(_ => {
                 model.PlusCounter();
+
                 _counterModel.PlusCounter();
                 _counterView.SetValueText(model.Counter);
+
                 _counterView.SetValueText(_counterModel.Counter);
 
             })
 
             })
 
             .AddTo(this);
 
             .AddTo(this);
行71: 行72:
 
             .OnClickAsObservable()
 
             .OnClickAsObservable()
 
             .Subscribe(_ => {
 
             .Subscribe(_ => {
                 model.MinusCounter();
+
                 _counterModel.MinusCounter();
                 _counterView.SetValueText(model.Counter);
+
                 _counterView.SetValueText(_counterModel.Counter);
 
             })
 
             })
 
             .AddTo(this);
 
             .AddTo(this);
 +
    }
 +
    void OnDestroy()
 +
    {
 +
        Destroy(this);
 
     }
 
     }
 
}
 
}

2021年9月15日 (水) 03:59時点における版

MVPとは

MV(R)Pで、ModelとViewとPresenterをReactiveで、疎結合に連携したパターン

準備

  1. UniRxをインストールしておく。

Unity/UniRx [ショートカット]

サンプル

CounterModel.cs

public class CounterModel
{
    public int Counter {
        get => counter;
        set => counter = value;
    }
    int counter = 0;

    public void PlusCounter()
    {
        counter++;
    }
    public void MinusCounter()
    {
        counter--;
    }
}

CounterView.cs

using UnityEngine;
using UnityEngine.UI;

public class CounterView : MonoBehaviour
{
    [SerializeField] public Button minusButton, plusButton;
    [SerializeField] public Text text;

    public void SetValueText(float value)
    {
        text.text = value.ToString();
    }
}

CounterPresenter.cs

using UnityEngine;
using UniRx;

public class CounterPresenter : MonoBehaviour
{
    [SerializeField] private CounterView _counterView;
    private CounterModel _counterModel;

    void Start()
    {
        _counterModel = new CounterModel();
        _counterView.SetValueText(_counterModel.Counter);

        _counterView.plusButton
            .OnClickAsObservable()
            .Subscribe(_ => {
                _counterModel.PlusCounter();
                _counterView.SetValueText(_counterModel.Counter);
            })
            .AddTo(this);

        _counterView.minusButton
            .OnClickAsObservable()
            .Subscribe(_ => {
                _counterModel.MinusCounter();
                _counterView.SetValueText(_counterModel.Counter);
            })
            .AddTo(this);
    }
    void OnDestroy()
    {
        Destroy(this);
    }
}

手順

  1. SampleSceneのヒエラルキーにTextとPlusButtonとMinusButtonを作成する。
  2. ヒエラルキーにGameObjectを作成して、CounterViewと変更する。CounterView.csをAddComponentする。
  3. CounterPresenter.csをMainCanvasにAddComponentする。
  4. CounterViewオブジェクトを選択し、インスペクターのCounterViewの部分にそれぞれのUIをドラッグする。
  5. MainCanvasのCounterPresenterにCounterViewオブジェクトをドラッグする。