Unity——用MVC分层实现“添加数字“案例

1. 代码实现的方法

1-1. 一般的实现

 一个功能模块的代码全部堆在一个脚本里面实现,耦合性高。

1-2. MVC分层实现

数据处理(Model数据模型)
显示部分(View视图)
逻辑控制(Controller控制器)

MVC


2. MVC的简单概念

C:控制器,负责流程控制和事件响应
V:视图,负责图形交互
M:数据模型,负责数据处理


3. MVC的开发步骤

  1. 场景搭建
  2. 创建处理数据的脚本(M)
    根据控制器的需要在模型脚本中创建对应的方法来让其调用。
  3. 创建显示部分的脚本(V)
    包括文本的显示,图片的显示。
  4. 创建逻辑控制的脚本(C)
    包括生命周期函数,逻辑控制语句。

4. 案例(使用json保存数据)

4-1. 使用一般的代码实现方法来实现简单的加数字(耦合性高)

  1. 搭建好场景
  2. 创建脚本(挂载在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));
    }

}
  1. 最后效果(数据会得到保存)
    在这里插入图片描述

4-2. 使用MVC分层实现方法来实现简单的加数字

将上面耦合度高的代码拆分成三个脚本, 分层管理, 维护起来更加方便。

  1. 创建MVC对应的文件夹(Controller,Model,View)
    在这里插入图片描述
  2. 分别创建好脚本(PanelController,PanelModel,PanelView)
    在这里插入图片描述
  3. 先写 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;
    }

}
  1. 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();
    }

}
  1. 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);
    }

}
  1. 最终效果(和 4-1 实现的效果一样,不过分成了三个脚本来实现)
    在这里插入图片描述

5.总结

  1. MVC模式的可扩展性,可维护性,可测试性比较强。
  2. MVC可能会使代码量增加,但利大于弊。

猜你喜欢

转载自blog.csdn.net/My_csdnQMDX/article/details/126409468