元某人也元某人也

Unity 里的轻量 MVC

小项目要不要 MVC、Model / View / Controller 怎么分,以及它的代价。

核心是通过明确的职责划分,解决代码混乱,维护困难的问题

  1. 数据模型Model:负责存储数据和处理数据逻辑
  2. 视图View:负责接收用户操作和展示数据
  3. 控制器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}";
    }
}
  1. 分离数据,数据归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); // 触发事件
    }
}
  1. 分离视图,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}";
    }
}
  1. 搭建桥梁:协调归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 篇笔记合并整理。

仅用于交流学习,记录学习心得