「Unity/MVP/値変更を自動でViewへ適用」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→参考) |
|||
| 行1: | 行1: | ||
| − | |||
==サンプル== | ==サンプル== | ||
CounterModel.cs | CounterModel.cs | ||
| 行6: | 行5: | ||
using UniRx; | using UniRx; | ||
| − | public class CounterModel | + | public class CounterModel |
{ | { | ||
public int Counter { | public int Counter { | ||
| 行54: | 行53: | ||
{ | { | ||
[SerializeField] private CounterView _counterView; | [SerializeField] private CounterView _counterView; | ||
| − | + | private CounterModel _counterModel; | |
void Start() | void Start() | ||
{ | { | ||
| + | _counterModel = new CounterModel(); | ||
_counterView.SetValueText(_counterModel.Counter); | _counterView.SetValueText(_counterModel.Counter); | ||
| + | Bind(); | ||
| + | } | ||
| + | private void Bind() | ||
| + | { | ||
_counterView.plusButton | _counterView.plusButton | ||
.OnClickAsObservable() | .OnClickAsObservable() | ||
| 行95: | 行99: | ||
# SampleSceneのヒエラルキーにTextとPlusButtonとMinusButtonとRefreshButtonを作成する。 | # SampleSceneのヒエラルキーにTextとPlusButtonとMinusButtonとRefreshButtonを作成する。 | ||
# ヒエラルキーにGameObjectを作成して、CounterViewに名前を変更する。CounterView.csをAddComponentする。 | # ヒエラルキーにGameObjectを作成して、CounterViewに名前を変更する。CounterView.csをAddComponentする。 | ||
| − | |||
# CounterPresenter.csをMainCanvasにAddComponentする。 | # CounterPresenter.csをMainCanvasにAddComponentする。 | ||
# CounterViewオブジェクトを選択し、インスペクターのCounterViewの部分にそれぞれのUIをドラッグする。 | # CounterViewオブジェクトを選択し、インスペクターのCounterViewの部分にそれぞれのUIをドラッグする。 | ||
| − | # | + | # MainCanvasのCounterPresenterにCounterViewオブジェクトをドラッグする。 |
==参考== | ==参考== | ||
2021年9月15日 (水) 17:16時点における版
サンプル
CounterModel.cs
using UnityEngine;
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
