Unity—MVC分层开发思想

news2024/12/26 1:03:14

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

目录

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.coloradmin.cn/o/1472235.html

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

相关文章

第十三天-mysql交互

目录 1.安装MySQL connector 方式1&#xff1a;直接安装 方式2&#xff1a;下载 2.创建链接 3.游标Cursor 4.事务控制 5. 数据库连接池 1. 使用 6.循环执行SQL语句 不了解mysql的可以先了解mysql基础 1.安装MySQL connector 1. MySQL connector 是MySQL官方驱动模块…

VirtualBox+Vagrant安装linux

一、VirtualBox安装 VirtualBox官网&#xff1a;Oracle VM VirtualBox 这里采用VirtualBox--7.0.0 版本 二、Vagrant安装 Vagrant官网&#xff1a;Vagrant by HashiCorp Vagrant镜像仓库&#xff1a;Discover Vagrant Boxes - Vagrant Cloud 这里采用Vagrant--2.4.1版本 在…

Python从入门到精通指南【第101篇—入门到精通】【文末送书-24】

文章目录 Python从入门到精通指南第一步&#xff1a;入门基础1.1 安装Python1.2 Hello World1.3 变量和数据类型1.4 控制流程 第二步&#xff1a;深入学习2.1 函数和模块2.2 列表、元组和字典2.3 文件操作 第三步&#xff1a;高级主题3.1 面向对象编程3.2 异常处理3.3 正则表达…

猫头虎分享已解决Bug || 无效的请求参数:InvalidRequestException

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

DP读书:《工程热力学(第二版)》(一)绪论——能量及其利用

DP读书&#xff1a;《工程热力学&#xff08;第二版&#xff09;》绪论 0.1 能量及其利用 热力学——研究对象&#xff1a;能量 能量 物质能量传递 普遍规律 能源&#xff1a;直接提供能量的物质资源 一次能源&#xff1a;热能占比85% 直接利用——>冶金、采暖、炊煮 …

全网最全AI绘画工具汇总(二)

一.AI绘画 图像 创造人工智能艺术的方式共有多种方法&#xff0c;包括使用数字模式的程序“基于规则”的图像生成、模拟笔触和其他绘画效果的算法&#xff0c;以及人工智能或深度学习算法等。 最早的重要人工智能艺术系统之一是AARON&#xff0c;由哈罗德科恩于1960年代末开…

PureFlash v1.9.1特性介绍

PureFlashv1.9.1版本特性主要有3个&#xff1a; 1. 支持RDMA网络 使用RDMA协议可以大大减少对CPU的消耗&#xff0c;性能提升30%以上。 PureFlash的网络配置分为存储节点间网络&#xff08;存储后端网&#xff09;和客户端网络&#xff08;前端网&#xff09;。都支持使用RD…

使用vuetify实现全局v-alert消息通知

前排提示&#xff0c;本文为引流文&#xff0c;文章内容不全&#xff0c;更多信息前往&#xff1a;oldmoon.top 查看 简介 使用强大的Vuetify开发前端页面&#xff0c;结果发现官方没有提供简便的全局消息通知组件&#xff08;像Element中的ElMessage那样&#xff09;&#xf…

桶装水配送小程序有什么功能 怎么制作

桶装水配送小程序是一种方便快捷的订水服务工具&#xff0c;可以帮助用户轻松订购桶装水&#xff0c;并实时跟踪订单配送情况。下面具体介绍送水小程序的功能。 1. 客户订水功能&#xff1a;用户可以通过小程序轻松选择需要的桶装水数量和配送时间&#xff0c;填写联系信息和地…

【AI Agent系列】【MetaGPT多智能体学习】0. 环境准备 - 升级MetaGPT 0.7.2版本及遇到的坑

之前跟着《MetaGPT智能体开发入门课程》学了一些MetaGPT的知识和实践&#xff0c;主要关注在MetaGPT入门和单智能体部分&#xff08;系列文章附在文末&#xff0c;感兴趣的可以看下&#xff09;。现在新的教程来了&#xff0c;新教程主要关注多智能体部分。 本系列文章跟随《M…

【VTKExamples::PolyData】第三十八期 Outline

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例Outline,并解析接口vtkOutlineFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Outline // Create…

DP读书:《半导体物理学(第八版)》(一)绪论 3min速通

DP读书&#xff1a;《半导体物理学&#xff08;第八版&#xff09;》刘恩科 3min速通半导体物理之绪论 DP读书&#xff1a;《半导体物理学&#xff08;第八版&#xff09;》刘恩科绪论第一章 半导体中的电子状态1.1 半导体的晶格结构和结合性质1.1.1 金刚石型结构和共价键1.1.2…

docker下gitlab安装配置

一、安装及配置 1.gitlab镜像拉取 docker pull gitlab/gitlab-ce:latest2.运行gitlab镜像 docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always --privilegedtrue -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v …

SAP MD81创建客户独立需求简介

正常我们用的最多的计划独立需求都是使用的是MD61 ,今天我们说下SAP的另外的一个标准功能客户独立需求MD81。虽然SAP给这个TCODE的描述是客户独立需求,但是实际是没有地方去关联对应的客户信息的。或者可以理解为是一个关联销售订单的一个计划独立需求。 1、MD81在SAP中的路…

交换两个整数

交换两个整数 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a;运行结果&#xff1a; 题目描述&#xff1a; 写⼀个函数Swap&#xff0c;可以交换两个整数的内容。注意必须实现成函数完成。 输入2个整数&#xff0c;调用自定义函数Swap&#xff0c;完成2个整数的…

赵本山念王小利写给李琳的信真费劲,原来不会写的字就打个圈(零)

赵本山念王小利写给李琳的信真费劲&#xff0c;原来不会写的字就打个圈&#xff08;零&#xff09; --小品《同桌的你》&#xff08;中3&#xff09;的台词 王小利&#xff1a;多亏桂琴给我帮助&#xff0c;借我铅笔给我橡皮&#xff0c;考试时候让我抄题&#xff0c; 赵本山&…

【Java程序设计】【C00287】基于Springboot的疫情防控期间某村外出务工人员管理系统(有论文)

基于Springboot的疫情防控期间某村外出务工人员管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的疫情防控期间某村外出务工人员信息管理系统 本系统分为系统功能模块、管理员功能模块、用户功能模块、采集…

6.3 认证授权模块 - 用户认证

认证授权模块 - 用户认证 文章目录 认证授权模块 - 用户认证一、用户认证 基础1.1 连接数据库认证1.1.0 用户表 xc_user1.1.1 分析1.1.2 安全管理配置 WebSecurityConfig1.1.3 自定义UserDetailsService1.1.4 授权服务器配置 AuthorizationServer 1.2 扩展用户身份信息1.2.1 修…

【JavaScript 漫游】【022】事件模型

文章简介 本篇文章为【JavaScript 漫游】专栏的第 022 篇文章&#xff0c;对 JavaScript 中事件模型相关的知识点进行了总结。 监听函数 浏览器的事件模型&#xff0c;就是通过监听函数&#xff08;listener&#xff09;对事件做出反应。事件发生后&#xff0c;浏览器监听到…

【栈与队列】用队列实现栈、用栈实现队列

【栈与队列】用队列实现栈、用栈实现队列 一、232. 用栈实现队列二、225. 用队列实现栈 一、232. 用栈实现队列 简单 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&…