|
|
(同じ利用者による、間の2版が非表示) |
行1: |
行1: |
− | ==MVPとは==
| + | [[Unity/MVP/Helloworld]] |
− | MV(R)Pで、ModelとViewとPresenterをReactiveで、疎結合に連携したパターン
| + | |
| | | |
− | ==準備==
| + | [[Unity/MVP/値変更を自動でViewへ適用]] |
− | # UniRxをインストールしておく。
| + | |
| | | |
− | [[Unity/UniRx]] [ショートカット] | + | [[Unity/MVP/公式サンプル]] |
− | | + | |
− | ==サンプル==
| + | |
− | CounterModel.cs
| + | |
− | <pre>
| + | |
− | using UnityEngine;
| + | |
− | using UniRx;
| + | |
− | | + | |
− | public class CounterModel : MonoBehaviour
| + | |
− | {
| + | |
− | public int Counter {
| + | |
− | get => counter.Value;
| + | |
− | set => counter.Value = value;
| + | |
− | }
| + | |
− | IntReactiveProperty counter = new IntReactiveProperty();
| + | |
− | | + | |
− | void Start()
| + | |
− | {
| + | |
− | counter.Subscribe(value => {
| + | |
− | Debug.Log("change value=" + value);
| + | |
− | });
| + | |
− | }
| + | |
− | public void PlusCounter()
| + | |
− | {
| + | |
− | counter.Value++;
| + | |
− | }
| + | |
− | public void MinusCounter()
| + | |
− | {
| + | |
− | counter.Value--;
| + | |
− | }
| + | |
− | public void SetCounter(int value)
| + | |
− | {
| + | |
− | counter.Value = value;
| + | |
− | }
| + | |
− | }
| + | |
− | </pre>
| + | |
− | | + | |
− | CounterView.cs
| + | |
− | <pre>
| + | |
− | 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();
| + | |
− | }
| + | |
− | }
| + | |
− | </pre>
| + | |
− | | + | |
− | CounterPresenter.cs
| + | |
− | <pre>
| + | |
− | using UnityEngine;
| + | |
− | using UniRx;
| + | |
− | | + | |
− | public class CounterPresenter : MonoBehaviour
| + | |
− | {
| + | |
− | [SerializeField] private CounterView _counterView;
| + | |
− | [SerializeField] private CounterModel _counterModel;
| + | |
− | | + | |
− | void Start()
| + | |
− | {
| + | |
− | _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);
| + | |
− | | + | |
− | _counterView.refreshButton
| + | |
− | .OnClickAsObservable()
| + | |
− | .Subscribe(_ => {
| + | |
− | _counterModel.SetCounter(_counterModel.Counter);
| + | |
− | _counterView.SetValueText(_counterModel.Counter);
| + | |
− | })
| + | |
− | .AddTo(this);
| + | |
− | }
| + | |
− | void OnDestroy()
| + | |
− | {
| + | |
− | Destroy(this);
| + | |
− | }
| + | |
− | }
| + | |
− | </pre>
| + | |
− | | + | |
− | ==手順==
| + | |
− | # SampleSceneのヒエラルキーにTextとPlusButtonとMinusButtonとRefreshButtonを作成する。
| + | |
− | # ヒエラルキーにGameObjectを作成して、CounterViewに名前を変更する。CounterView.csをAddComponentする。
| + | |
− | # ヒエラルキーにGameObjectを作成して、CounterModelに名前を変更する。CounterModel.csをAddComponentする。
| + | |
− | # CounterPresenter.csをMainCanvasにAddComponentする。
| + | |
− | # CounterViewオブジェクトを選択し、インスペクターのCounterViewの部分にそれぞれのUIをドラッグする。
| + | |
− | # MainCanvasのCounterPresenterにCounterViewオブジェクトとCounterModelオブジェクトをドラッグする。
| + | |
− | | + | |
− | ==変更したい値からイベント発生==
| + | |
− | CounterModel.csにあるcounter.Subscribe()の部分で値が変更されていれば、処理される。
| + | |
− | | + | |
− | ==参考==
| + | |
− | https://qiita.com/OKsaiyowa/items/745c5359682c7baad6bf
| + | |
− | | + | |
− | https://qiita.com/Nakashima_Toshiki/items/5e0c36c3b0df78110d32
| + | |