小项目要不要 MVC、Model / View / Controller 怎么分,以及它的代价。
核心是通过明确的职责划分,解决代码混乱,维护困难的问题
- 数据模型Model:负责存储数据和处理数据逻辑
- 视图View:负责接收用户操作和展示数据
- 控制器Controller;链接Model和View,当View收到用户操作,Controller就转发指令给Model修改数据,当Model发生改变Controller就通知View更新界面
MVC示例:将一个计数器的diamagnetic转换为MVC的架构形式
原脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Counter : MonoBehaviour
{
// 计数数据
private int count = 0;
// Unity UI Component
[SerializeField] private TextMeshProUGUI countText;
[SerializeField] private Button addButton;
private void Start()
{
addButton.onClick.AddListener(OnAddButtonClicked);
UpdateCountDisplay(); // 初始化显示
}
// 修改计数数据
public void AddCount(int value)
{
count += value;
UpdateCountDisplay();
}
// 按钮点击调用
private void OnAddButtonClicked()
{
AddCount(1);
}
// 更新文本显示
private void UpdateCountDisplay()
{
countText.text = $"Count: {count}";
}
}
|
- 分离数据,数据归Model
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| using System;
public class CounterModel
{
// 计数数据
private int count = 0;
// 数值变化事件
public event Action<int> OnCountChanged;
// 修改计数数据
public void AddCount(int value)
{
count += value;
OnCountChanged?.Invoke(count); // 触发事件
}
}
|
- 分离视图,UI归View
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public class CounterView : MonoBehaviour
{
// Unity UI Component
[SerializeField] private TextMeshProUGUI countText;
[SerializeField] private Button addButton;
// 初始化
public void Initialize(Action onClickAddButton)
{
addButton.onClick.AddListener(() => onClickAddButton?.Invoke());
}
// 更新文本显示
public void UpdateCountDisplay(int count)
{
countText.text = $"Count: {count}";
}
}
|
- 搭建桥梁:协调归Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| using UnityEngine;
public class CounterController : MonoBehaviour
{
[SerializeField] private CounterView view; // 视图引用
private CounterModel model; // 数据模型
private void Start()
{
// 初始化 Model
model = new CounterModel();
// 初始化 View
view.Initialize(OnAddButtonClicked);
// Model 数据变化事件绑定
model.OnCountChanged += view.UpdateCountDisplay;
// 初始化显示
view.UpdateCountDisplay(model.Count);
}
// 点击按钮
private void OnAddButtonClicked()
{
model.AddCount(1); // 计数加1
}
}
|
本文由 3 篇笔记合并整理。