Unity—MVC分层开发思想

每日一句:当你不努力的时候,天赋就会一点一点被收回

目录

MVC分层开发思想

MVC是什么

MVC的开发步骤

案例:点击按钮实现金币进行添加,并且把金币记录到JSON里

MVC模式实现

背包系统基础代码

背包项目实现步骤


MVC分层开发思想

(旧的)代码实现方法

一个功能模块的代码逻辑(显示处理,数据处理,逻辑判定)都写在一起(耦合)

(新的)代码MVC分层实现方法

显示部分实现(View视图)

数据处理实现(Model数据模型)

逻辑判定实现(Controller控制器)

MVC是什么

C:控制器,负责流程控制和事件相应

V:视图,负责图形交互

M:数据模型,负责数据处理

MVC的开发步骤

1.页面预制体制作

2,处理数据(数据模型脚本)

JSON读写操作

数据的CURD操作

C:Create增加数据

U:Update修改数据

R:   Read读取数据

D:Delete删除数据

根据控制器调用模型的方式数量,在模型中编写对应数量的函数,以供调用

3.显示(视图脚本)

文本的显示

图片的显示

列表的显示

其他美术资源(模型,动作,特效)

4.逻辑控制(控制器脚本)

生命周期函数

逻辑控制语句

案例:点击按钮实现金币进行添加,并且把金币记录到JSON里

public static class Config

{

    public static string UserNumer = Application.persistentDataPath + "/UserNumer.json";

}

using LitJson;

using System.Collections;

using System.Collections.Generic;

using System.IO;

using UnityEngine;

using UnityEngine.UI;

public class UIMainMenu : MonoBehaviour

{

    private Text GoldCount;

    // Start is called before the first frame update

    void Start()

    {

        //找到Text子物体

        GoldCount = transform.Find("Gold").GetComponent<Text>();

        //通过路径找子物体

        transform.Find("Button").GetComponent<Button>().onClick.AddListener(GoldAddClick);

        //将JSON文件中的数据,读取出来,显示在页面上

        //进入页面,就检查JSON文件是否存在

        if (!File.Exists(Config.UserNumer))

        {

            //处理JSON数据

            JsonData d = new JsonData();

            d["GoldCount"] = 0;

            File.WriteAllText(Config.UserNumer, d.ToJson());

            //处理显示

            GoldCount.text = "0";

        }

        else

        {

            //将已有的数据读取出来,并显示在UI上

            string json = File.ReadAllText(Config.UserNumer);

            JsonData d = JsonMapper.ToObject(json);

            GoldCount.text = d["GoldCount"].ToString();

        }

    }

    public void GoldAddClick()

    {

        //读取数据

        string json = File.ReadAllText(Config.UserNumer);

        JsonData d = JsonMapper.ToObject(json);

        //增加金币数1

        d["GoldCount"] = (int)d["GoldCount"] + 1;

        //更新显示部分(Text)

        GoldCount.text = d["GoldCount"].ToString();

        //更新JSON数据(JSON)

        File.WriteAllText(Config.UserNumer, d.ToJson());

    }

}

MVC模式实现

C:控制器,负责流程控制和事件相应

public class UIMainMenuController : MonoBehaviour

{

    public UserNumweicalview View;

    private void Start()

    {

        View.Init();

        transform.GetComponent<Button>().onClick.AddListener(GoldAddClick);

        UserDataModel.CreateNew();

        JsonData d = UserDataModel.ReadAllData();

        View.Refresh(d);

    }

    public void GoldAddClick()

    {

        JsonData d = UserDataModel.UpdateGold(1);

        View.Refresh(d);

    }

}

V:视图,负责图形交互

public class UserNumweicalview : MonoBehaviour

{

    Text GoldCount;

    public void Init()

    {

        GoldCount = transform.Find("Count").GetComponent<Text>();

    }

    public void Refresh(JsonData data)

    {

        GoldCount.text = data["GoldCount"].ToString();

    }

}

M:数据模型,负责数据处理

public class UserDataModel : MonoBehaviour

{

    //创建新的用户数据

    public static void CreateNew()

    {

        if(!File.Exists(Config._UserNumer))

        {

            JsonData d = new JsonData();

            d["GoldCount"] = 0;

            File.WriteAllText(Config._UserNumer, d.ToJson());

        }

    }

    //读取用户数据

    public static JsonData ReadAllData()

    {

        string json = File.ReadAllText(Config._UserNumer);

        return JsonMapper.ToObject(json);

    }

    //更新金币数

    public static JsonData UpdateGold(int count)

    {

        string json = File.ReadAllText(Config._UserNumer);

        JsonData d = JsonMapper.ToObject(json);

        d["GoldCount"] = (int)d["GoldCount"] + count;

        File.WriteAllText(Config._UserNumer, d.ToJson());

        return d;

    }

}

背包系统基础代码

using UnityEngine.U2D;

using UnityEngine.UI;

public class UIItemCellView : MonoBehaviour

{

    Image Icon;

    Image Frame;

    Text Count;

    public void Display(JsonData data)

    {

        //图标

        string[] icon = data["Icon"].ToString().Split("#");

        SpriteAtlas icons = Resources.Load<SpriteAtlas>("UI/" + icon[0]);

        Icon.sprite = icons.GetSprite(icon[1]);

        SpriteAtlas altas = Resources.Load<SpriteAtlas>("UI/Package");

        switch ((int)data["Quality"])

        {

            case 1:

                Frame.sprite = altas.GetSprite("_white");

                break;

            case 2:

                Frame.sprite = altas.GetSprite("_red");

                break;

        }

        //持有数量

        Count.text = data["Count"].ToString();

    }

}

using UnityEngine.U2D;

using UnityEngine.UI;

public class UIItemProfileView : MonoBehaviour

{

    public Image Icon;

    public Image Frame;

    public Text Count;

    public Text Name;

    public Text Description;

    public Text GoldCount;

    public void Display(JsonData data)

    {

        //图标

        string[] icon = data["Icon"].ToString().Split("#");

        SpriteAtlas icons = Resources.Load<SpriteAtlas>("UI/" + icon[0]);

        Icon.sprite = icons.GetSprite(icon[1]);

        //品质框,加载图集

        SpriteAtlas atlas = Resources.Load<SpriteAtlas>("UI/Package");

        switch((int)data["Quality"])

        {

            case 1:

                Frame.sprite = atlas.GetSprite("_white");

                break;

            case 2:

                Frame.sprite = atlas.GetSprite("_red");

                break;

        }

        //道具名称

        Name.text = data["Name"].ToString();

        //持有数量

        Count.text = "拥有<color=#0148B9FF" + data["Count"].ToString() + "</color>件";

        //描述

        Description.text = data["Dscription"].ToString();

        GoldCount.text = data["CellGold"].ToString();

    }

}

public class UIPackageController : MonoBehaviour

{

    void Start()

    {

        JsonData list = UserDataModel.ReadCompleteMyItemsData();

        for(int i=0;i<list.Count;i++)

        {

            Object prefab = Resources.Load("Prefabs/UI/ItemCell");

            GameObject cell = Object.Instantiate(prefab) as GameObject;

            UIItemCellView view = cell.transform.GetComponent<UIItemCellView>();

            view.Display(list[i]);

        }

    }

}

using System.IO;

using UnityEngine;

using LitJson;

public class UserDataModel : MonoBehaviour

{

    static string FilePath= Application.persistentDataPath + "/UserBag.json";

    public static JsonData ReadCompleteMyItemsData()

    {

        //动态数据

        string json = File.ReadAllText(FilePath);

        JsonData dynamic = JsonMapper.ToObject(json);

        //静态数据

        TextAsset asset = Resources.Load<TextAsset>("Json/item");

        JsonData config = JsonMapper.ToObject(asset.text);

        //最终返回的数据

        JsonData d = new JsonData();

        //合并返回(打开两个JSON文件对着写,观察结构)

        for(int i=0;i<dynamic["Items"].Count;i++)

        {

            int itemid = (int)dynamic["Items"][i]["ItemID"];

            for(int j=0;j<config.Count;j++)

            {

                //找到动态表和静态表中对应的数据

                if(itemid==(int)config[j]["ItemID"])

                {

                    //最终需要的就是静态表和动态表的数量

                    //拼接放入最终的完整数据中

                    JsonData row = config[j];

                    row["Count"] = dynamic["Items"][i]["Count"];

                    d.Add(row);

                }

            }        

    }

        return d;

    }

}

动态数据

静态数据

背包项目实现步骤

  1. 在Bootstrap中实现的服务器数据的默认生成
  2. 编写脚本,模拟服务器数据处理,读取角色数据
  3. 编写配置文件(多次调用数据)
  4. 编写道具配表的数据模型     根据服务器提供的数据,到策划提供的所有道具数据,筛选出需要在UI界面上,显示的数据
    1. 遍历拥有的道具
    2. 根据步骤1的ID去策划配置表数据取出对应数据
    3. 获得服务器数据和策划配置数据(根据ItemID对应)
  5. 引导脚本编写
    1. 首页Controller,添加数值修改组件和事件回调函数,挂脚本并拖组件和按钮回调函
    2. 将头部数值部分,加父物体,并挂在数值控制View
    3. 导入自己封装的预制体加载类
    4. 引导脚本,加载首页预制体
    5. 在首页Start中,调用服务器模拟数据,传递给视图,最终显示
  6. 显示背包页

        首页的背包按钮回调函数中添加背包加载代码

        将背包控制器挂在背包页面预制体上

        左右各一个View脚本(组件挂载,右侧给Grid的Transform加组件)

        控制器上添加事件(按钮,搜索内容框加内容动态修改事件)

        进入背包时,需要将首页中读取的角色拥有道具信息数据,传递过来Intatiate执行时,会调用Awake声明周期函数,同时执行的代码,会先于Start执行,所以Start可以取到传递过来的数据

        背包控制器将数据传递给视图,视图接到数据后,遍历数据,循环内加载Cell,并根据配表修改Cell内容

        7. Cell上添加Lambda表达式卡柱数据,点击将Cell上数据传递给背包控制器,背包控制器收到数据后,修改左侧View视图对应UI元素

        8.出售按钮点击后,背包控制器接收到数据,调用Server数据类修改JsonData底层数据,后期将数据存储在Server数据类的Data成员变量中,删除数据,不能赋值为null,必须将数据重置后,再遍历原始数据重新赋值

        9.背包控制器调用数据修改完成后,要重新刷新右侧View列表,注意,应该现将列表原始的数据清除,再放入新的值

        10.角色数值修改请使用配表实现

        11.类型切换,请参考出售功能(需要刷新右侧列表)

        12.搜索功能,请参考出售功能(需要刷新右侧列表)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue+element ui】大屏自适应中el-select下拉内容在低分辨率下显示不全问题解决

目录 背景 现象 解决方案 背景 最近要把一个1920px*1080px的大屏改成自适应的&#xff1b;最低适配到1028px*720px&#xff1b; 现象 自适应适配改完之后 将电脑屏幕改成1028px*720px分辨率后&#xff0c;下拉显示正常 通过谷歌浏览器设置Toggle device toolbar为1028px*…

Fastjson2 <== 2.0.26反序列漏洞

根据Y4TACKER师傅在2023-03-20发布了一篇关于Fastjson原生反序列化的文章&#xff0c;文章中引入注目的是利用条件限制条件&#xff0c;不常常关注漏洞预警或者内容的几乎都是未发觉Fastjson2 到Fastjson2 2.0.26版本都有问题&#xff0c;其实如果单独去使用一些关键词去搜索&a…

Aws Ec2服务器设置密码登录

通过密钥&#xff0c;ssh登录到服务器 切换到root sudo -i开始设置root的新密码 passwd root输入并确认新密码即可 5.修改ssh配置文件 vim /etc/ssh/sshd_config6.重启sshd配置 systemctl restart sshd

QML中动态增加表格数据

1.QML中的表格实现 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableModel{id:table_modelTabl…

接口测试-幂等测试

我们知道一个网站的访问中会有很多各种各样的接口请求 比如说拿一个购物网站来说&#xff0c;有注册&#xff0c;有登录&#xff0c;有浏览商品&#xff0c;有添加购物车&#xff0c;查询购物车商品这些接口&#xff0c;还有一类特殊的接口&#xff0c;比如&#xff1a;支付。…

【JavaEE进阶】 Spring AOP详解

文章目录 &#x1f38b;前言&#x1f38d;Spring AOP核心概念&#x1f6a9;切点(Pointcut)&#x1f6a9;连接点(Join Point)&#x1f6a9;通知(Advice)&#x1f6a9;切面(Aspect) &#x1f340;通知类型&#x1f6a9;注意事项 &#x1f332;PointCut&#x1f384;切面优先级Ord…

深入理解Linux线程(LWP):概念、结构与实现机制(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;会いたい—Naomile 1:12━━━━━━️&#x1f49f;──────── 4:59 &#x1f504; ◀️ ⏸ ▶️ ☰ &a…

vue 解决:点击左侧相同菜单,右侧页面不重新加载的问题

1、问题描述&#xff1a; 其一、需求为&#xff1a; 无论是通过路由组件形成的平台管理系统&#xff0c;还是通过文件配置形成的平台管理系统&#xff0c;都存在通过切换左侧的导航栏而使右侧的页面切换的业务需求&#xff1b; 其二、问题描述为&#xff1a; A、步骤一&#…

基于RISC-V架构的通信DSP的设计以及在5G RedCap基带中的应用(五)-基于RISC-V的RedCap DSP在5G基带中的应用

4 基于RISC-V的RedCap DSP在5G基带中的应用 4.1 基带处理器的关键任务和性能需求 基带处理器是移动通信设备中的关键部件&#xff0c;负责处理无线信号&#xff0c;包括信号的接收、发送和处理。在5G通信系统中&#xff0c;基带处理器的关键任务和性能需求包括以下几个方面&a…

【Linux C | 网络编程】gethostbyname 函数详解及C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

就业班 2401--2.29 Linux Day8--存储管理2(LVM)+swap+磁盘阵列raid

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;小伙伴们一定要看到最后&#xff0c;有彩蛋呢^--^ 一、存储管理Ⅱ 逻辑卷LVM &#xff08;Logical Volume Manager&#xff08;逻辑卷管理&#xff09;的简写&#xff09; LVM管理 lvm概念&#xf…

代理IP如何帮助领英账号预防封号限制?

LinkedIn是跨境外贸必备的拓客工具&#xff0c;世界各地的许多专业人士都使用领英来作为发布和共享内容的主要工具&#xff0c;这使得它成为跨境出海必备的渠道工具。 但是不少做外贸的朋友都知道&#xff0c;领英账号很容易遭遇限制封禁&#xff0c;但如果善用工具&#xff0…

单点登录的三种方式

前言 在B/S系统中&#xff0c;登录功能通常都是基于Cookie 来实现的。当用户登录成功后&#xff0c;一般会将登录状态记录到Session中&#xff0c;或者是给用户签发一个 Token&#xff0c;无论哪一种方式&#xff0c;都需要在客户端保存一些信息(Session ID或Token)&#xff0…

redis-RedisTemplate.opsForGeo 的geo地理位置及实现附近的人的功能

redis内部使用的是 zset 数据结构存储&#xff0c;如下 import cn.huawei.VideoApplication; import cn.huawei.domain.Jingqu; import cn.huawei.service.JingquService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired…

Tkinter.Text控件中,文本存在某个关键字的将被高亮显示(标记颜色+字体加粗)

在Tkinter的Text控件中&#xff0c;要标记某个关键字并改变其颜色&#xff0c;你可以使用tag_add方法来给包含关键字的文本添加标签&#xff0c;然后使用tag_config方法来配置该标签的显示样式&#xff0c;包括前景色&#xff08;字体颜色&#xff09;和背景色等。以下是一个完…

云桥通+IDC数据中心:SDWAN企业组网实现高效连接案例

一、需求和背景 云桥通曾服务的一家大型跨国企业C公司&#xff0c;C公司多个数据中心分布在全球各地。为了实现数据共享和协作&#xff0c;数据中心之间需要建立稳定高效的网络连接。然而&#xff0c;传统的MPLS专线网络存在昂贵的成本和漫长的开通周期&#xff0c;无法满足企…

机器学习|线性回归

线性回归是尝试使用一条直线去拟合出图上的节点。 e i e_i ei​为第i个点构成的误差&#xff0c;使用平方的好处一是可以避免正负抵消&#xff0c;二是平方有利于放大大于1的误差的影响&#xff0c;同时缩小误差小于1的影响。 将平方项进行展开&#xff0c;以w作为变元&…

C++指针(二)

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 文章目录 1.数组指针 1.1数组指针的概念 1.2数组指针的用处 1.3数组指针的操作 1.4二维数组如何访问 1.5数组指针访问流程 1.6数组指针的练习题 2.指针数组 2.1指针数组的概念 2.2指针数组的用处 2…

ChemDraw Pro 2022:呈现专业化学绘图的极 致之作 mac/win版

PerkinElmer ChemDraw Pro 2022是一款功能强大的化学绘图软件&#xff0c;专为化学家、科研工作者和教育者设计。这款软件凭借其卓越的性能和丰富的功能&#xff0c;已经成为化学绘图领域的领导者。 PerkinElmer ChemDraw Pro 2022软件获取 ChemDraw Pro 2022提供了广泛的化学…

接口自动化测试用例如何设计,一文搞定!

说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀&#xff0c;甚至出现“ 做平台的 &…