Unity——用MVC分层实现"添加数字"案例
1. 代码实现的方法
1-1. 一般的实现
一个功能模块的代码全部堆在一个脚本里面实现,耦合性高。
1-2. MVC分层实现
数据处理(Model数据模型)
显示部分(View视图)
逻辑控制(Controller控制器)
2. MVC的简单概念
C:控制器,负责流程控制和事件响应
V:视图,负责图形交互
M:数据模型,负责数据处理
3. MVC的开发步骤
- 场景搭建
- 创建处理数据的脚本(M)
根据控制器的需要在模型脚本中创建对应的方法来让其调用。 - 创建显示部分的脚本(V)
包括文本的显示,图片的显示。 - 创建逻辑控制的脚本(C)
包括生命周期函数,逻辑控制语句。
4. 案例(使用json保存数据)
4-1. 使用一般的代码实现方法来实现简单的加数字(耦合性高)
- 搭建好场景
- 创建脚本(挂载在Panel上)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
// json文件的模型类
[System.Serializable]
public class Data
{
public int num;
}
public class SimpleMethod : MonoBehaviour
{
// json文件的路径
private string path;
// 数字文本
private Text numText;
// 添加数字的按钮
private Button btn;
private void Awake()
{
// 获取数字文本
numText = transform.Find("Image/Text").GetComponent<Text>();
// 获取按钮
btn = transform.Find("Button").GetComponent<Button>();
// 创建json文件路径
path = Application.persistentDataPath + "/data.json";
}
private void Start()
{
// 给按钮添加点击时间
btn.onClick.AddListener(ClickAddNumber);
// 如果json文件路径不存在, 就新建一个文件
if (!File.Exists(path))
{
// 创建json模型类对象
Data data = new Data();
// 给里面的数据初始化一个值
data.num = 0;
// 更改文本内容
numText.text = data.num.ToString();
// 将对象转换为json字符串写入json文件,如果文件不存在,这个方法会自己创建一个文件
File.WriteAllText(path, JsonUtility.ToJson(data));
}
// 如果文件存在
else
{
// 将json文件的内容读取出来
string json = File.ReadAllText(path);
// 解析json字符串
Data data = JsonUtility.FromJson<Data>(json);
// 将里面的数据更新到场景中
numText.text = data.num.ToString();
}
}
// 点击添加数字
private void ClickAddNumber()
{
// 将json文件的内容读取出来
string json = File.ReadAllText(path);
// 解析json字符串
Data data = JsonUtility.FromJson<Data>(json);
// 点击按钮后数字加1
data.num += 1;
// 将数据更新到场景中
numText.text = data.num.ToString();
// 将新的数据写入json文件
File.WriteAllText(path, JsonUtility.ToJson(data));
}
}
- 最后效果(数据会得到保存)
4-2. 使用MVC分层实现方法来实现简单的加数字
将上面耦合度高的代码拆分成三个脚本, 分层管理, 维护起来更加方便。
- 创建MVC对应的文件夹(Controller,Model,View)
- 分别创建好脚本(PanelController,PanelModel,PanelView)
- 先写 PanelModel 脚本(无需挂载)
这个脚本只是用来处理数据, 只封装一些方法提供给Controller使用, 可以做成单例或静态类, 方便Controller调用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
// json文件的模型类
[System.Serializable]
public class JsonData
{
public int num;
}
public static class PanelModel
{
// json文件路径
private static string path = Application.persistentDataPath + "/data.path";
// 初始化操作
public static void Init()
{
// 如果json文件路径不存在, 就新建一个文件
if (!File.Exists(path))
{
// 创建json模型类对象
Data data = new Data();
// 给里面的数据初始化一个值
data.num = 0;
// 将对象转换为json字符串写入json文件,如果文件不存在,这个方法会自己创建一个文件
File.WriteAllText(path, JsonUtility.ToJson(data));
}
}
// 解析json文件并返回
public static JsonData ReadJsonFile()
{
// 读取json文件里的内容
string json = File.ReadAllText(path);
// 解析并返回
return JsonUtility.FromJson<JsonData>(json);
}
// 更新数据
public static JsonData UdpateJsonData(int i)
{
// 获取json文件解析后的内容
JsonData data = ReadJsonFile();
// 将里面的 num 加上传递过来的数值
data.num += i;
// 将新的数据写入到json文件中
File.WriteAllText(path, JsonUtility.ToJson(data));
// 返回新的数据
return data;
}
}
- PanelView(挂载在Image)
该脚本用于显示文本。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PanelView : MonoBehaviour
{
// 数字文本
private Text numText;
// 初始化操作
public void Init()
{
// 获取数字文本
numText = transform.Find("Text").GetComponent<Text>();
}
// 更新文本的数据
public void UpdateTextData(JsonData data)
{
// 将传递过来的新数据更新到Text中
numText.text = data.num.ToString();
}
}
- PanelController(挂载在Panel)
通过调用Model或直接调用View里的方法,来实现全部的功能。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PanelController : MonoBehaviour
{
// PanelView脚本组件
private PanelView panelView;
private void Awake()
{
// 获取到按钮并添加点击事件
transform.Find("Button").GetComponent<Button>().onClick.AddListener(ClickAddNumber);
// 获取PanelView脚本组件
panelView = transform.Find("Image").GetComponent<PanelView>();
// panelView 里的初始化操作
panelView.Init();
}
private void Start()
{
// PanelModel 里的初始化操作
PanelModel.Init();
// 获取解析后的json内容
JsonData data = PanelModel.ReadJsonFile();
// 更新Text文本
panelView.UpdateTextData(data);
}
// 按钮点击事件, 点击按钮数字加1
private void ClickAddNumber()
{
// 传递新数据过去,Model类会将数据处理完后并返回
JsonData data = PanelModel.UdpateJsonData(1);
// 更新Text文本
panelView.UpdateTextData(data);
}
}
- 最终效果(和 4-1 实现的效果一样,不过分成了三个脚本来实现)
5.总结
- MVC模式的可扩展性,可维护性,可测试性比较强。
- MVC可能会使代码量增加,但利大于弊。