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); } }
手順
- SampleSceneのヒエラルキーにTextとPlusButtonとMinusButtonとRefreshButtonを作成する。
- ヒエラルキーにGameObjectを作成して、CounterViewに名前を変更する。CounterView.csをAddComponentする。
- CounterPresenter.csをMainCanvasにAddComponentする。
- CounterViewオブジェクトを選択し、インスペクターのCounterViewの部分にそれぞれのUIをドラッグする。
- MainCanvasのCounterPresenterにCounterViewオブジェクトをドラッグする。
参考
https://qiita.com/Nakashima_Toshiki/items/5e0c36c3b0df78110d32