facebook twitter hatena line email

Unity/MVP/値変更を自動でViewへ適用

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

サンプル

CounterModel.cs

using UniRx;

public class CounterModel
{
    public int Counter {
        get => counterRP.Value;
        set => counterRP.Value = value;
    }
    public IntReactiveProperty counterRP = new IntReactiveProperty();

    public void PlusCounter()
    {
        counterRP.Value++;
    }
    public void MinusCounter()
    {
        counterRP.Value--;
    }
    public void SetCounter(int value)
    {
        counterRP.Value = value;
    }
}

CounterView.cs

using UnityEngine;
using UnityEngine.UI;

public class CounterView : MonoBehaviour
{
    [SerializeField] public Button minusButton, plusButton, refreshButton;
    [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);

        Bind();
    }
    private void Bind()
    {
        _counterView.plusButton
            .OnClickAsObservable()
            .Subscribe(_ => {
                _counterModel.PlusCounter();
            })
            .AddTo(this);

        _counterView.minusButton
            .OnClickAsObservable()
            .Subscribe(_ => {
                _counterModel.MinusCounter();
            })
            .AddTo(this);

        _counterView.refreshButton
            .OnClickAsObservable()
            .Subscribe(_ => {
                _counterModel.SetCounter(_counterModel.Counter);
            })
            .AddTo(this);
        // 値が変更したらView更新イベント発生
        _counterModel.counterRP.Subscribe(value => {
            _counterView.SetValueText(_counterModel.Counter);
        });
    }
    void OnDestroy()
    {
        Destroy(this);
    }
}

手順

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

参考

https://qiita.com/Nakashima_Toshiki/items/5e0c36c3b0df78110d32

https://developers.cyberagent.co.jp/blog/archives/4262/