Unity—MVC分层开发思想

news/2024/7/27 12:21:07

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

目录

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.mrgr.cn/p/32113466

相关文章

web自动化——Selenium 之下拉

一、select下拉列表Select类处理select-option1)导入Select类 from selenium.webdriver.support.select import Select2)确保你要操作的元素是select。实例化Select类 Select()3)找到select元素对象 select_ele=driver.find_element(By.NAME,cars)4)将select对象作为参数 s…

Servlet快速入门

注:出自黑马程序员

CentOS的yum报错except OSError, e:

报错信息 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile base: mirrors.cloud.aliyuncs.comextras: mirrors.cloud.aliyuncs.comupdates: mirrors.cloud.aliyuncs.com File “/usr/libexec/urlgrabber-ext-down”, line 28 except OSError, e: ^…

unity使用Registry类将指定内容写入注册表

遇到一个新需求&#xff0c;在exe执行初期把指定内容写入注册表&#xff0c;Playerprefs固然可以写入&#xff0c;但是小白不知道怎么利用Playerprefs写入DWORD类型的数据&#xff0c;因此使用了Registry类 一. 对注册表中键的访问 注册表中共可分为五类 一般在操作时&#…

Oracle---windows下安装oracle19c

Oracle---windows下安装oracle19c</div><div class="postText"><div id="cnblogs_post_body" class="blogpost-body blogpost-body-html"> 目录: 一. 官网下载oracle19c 以及客户端 二.安装oracle19c 三.配置 1.配置服务 2.配…

oracle11安装及使用

安装oracle11 官网下载地址 Oracle Database 11g Release 2 for Microsoft Windows (x64) 官网下载慢可访问我的资源 也可以网盘获取 链接&#xff1a;https://pan.baidu.com/s/1RDrGkqDA7tfKRnpJXUBMDw 提取码&#xff1a;z3na 上传安装包到服务器 在指定目录下创建文件…

常用日期和时间标准对比:HTML, ISO 8601, RFC 3339, RFC 5322

日期和时间,对于不同系统和平台之间的数据交换和互操作至关重要。本文将对比 HTML 标准、ISO 8601、RFC 3339 和 RFC 5322,为读者提供参考。1. HTML, ISO 8601, RFC 3339, RFC 5322 对比 日期和时间,对于不同系统和平台之间的数据交换和互操作至关重要。本文将对比 HTML 标准…

3.1 IO进程线程

使用fwrite、fread将一张随意的bmp图片&#xff0c;修改成德国的国旗 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main(int argc, const char *argv[]) {FILE* fp fopen("./2.bmp","r&quo…

[游戏开发][虚幻5]新建项目注意事项

鼠标右键点击Client.uproject文件&#xff0c;可以看到三个比较关键的选项&#xff0c; 启动游戏&#xff0c;生成sln解决方案&#xff0c;切换引擎版本 断点调试 C代码重要步骤 如果你想断点调试C代码&#xff0c;则必须使用使用代码编译启动引擎&#xff0c;你需要做几个操作…

【李宏毅机器学习2021】(四)Self-attention

引入 Self-attention 前面学到的内容输入都是一个向量,假如输入是一排向量,又应如何处理。来看下有什么例子需要将一排向量输入模型:当输入是一排向量时,输出有三种类型:输入和输出的长度一样,每一个向量对应一个 label,如词性标注、音标识别、节点特性(如会不会买某件…

安装 Ubuntu 22.04.3 和 docker

文章目录 一、安装 Ubuntu 22.04.31. 简介2. 下载地址3. 系统安装4. 系统配置 二、安装 Docker1. 安装 docker2. 安装 docker compose3. 配置 docker 一、安装 Ubuntu 22.04.3 1. 简介 Ubuntu 22.04.3 是Linux操作系统的一个版本。LTS 版本支持周期到2032年。 系统要求双核 C…

【洛谷】闰年

题目描述 很简单,判断给定的年份是不是闰年。 但问题在于我一开始还真不知道闰年的定义..#include<iostream> using namespace std;int main(){int year;cin>>year;if((year%4 == 0 && !(year%100 == 0)) || (year%400 == 0) ){cout<<1;}else{cout&…

综合练习(二)

目录 列出薪金比 SMITH 或 ALLEN 多的所有员工的编号、姓名、部门名称、领导姓名、部门人数&#xff0c;以及所在部门的平均工资、最高和最低工资 补充 spool Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 列出薪金比 SMITH 或 AL…

Python错题集-4:NameError:(变量名错误)

1问题描述 Traceback (most recent call last): File "D:\pycharm\projects\1-可视化学习\8.3更改小提琴图的中位数、均值、颜色等.py", line 8, in <module> violin_parts plt.violinplot(data, showmediansTrue, showmeansTrue) …

【计算机网络】数据链路层——差错控制

差错控制(检错) 差错从何而来? 概括来说,传输中的差错都是由于噪声引起的。 全局性 由于线路本身电气特性所产生的随机噪声(热噪声),是信道固有的,随机存在的。 解决办法:提高信噪比来减少或避免干扰。(对传感器下手) 局部性 外界特定的短暂原因所造成的冲击噪声,是产生差错…

vue3使用elementPlus进行table合并处理

elementPlus中table合并部分列 虚拟数据中公司下有多个客户&#xff0c;公司一样的客户&#xff0c;公司列需要合并&#xff0c;客户如果一样也需要合并进行展示&#xff0c;效果展示 const tableData ref([])自定定义自已想要的数据&#xff0c;一般都是通过接口拿到 //table…

top 命令解释

PID:进程ID USER:运行改进程的用户 PR:进程的优先级 NI:Nice值,进程的优先级修正值,负值表示高优先级,正值表示低优先级 VIRT:虚拟内存,进程使用的虚拟内存总量 RES:物理内存,进程实际使用的物理内存总量 SHR:共享内存,进程实际使用的共享内存总量 S:进程状态,包…

【洛谷】数的性质

题目不难,但是很考验读题的能力和运用逻辑符号的能力。 代码: #include<iostream> using namespace std;int main(){int x;cin>>x;bool res[4] = {0,0,0,0};bool a = (x%2 == 0);bool b = (x>4 && x <= 12);if(a && b){res[0] = 1;}if(a |…

【Sql server】假设有三个字段a,b,c 以a和b分组,如何查询a和b唯一,但是c不同的记录

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

Spectrum高速采集存储系统

产品简介: ♦连续(无丢失)数据记录 ♦ 传输度高达3 GByte/s ♦ 一体化系统解决方案 ♦ 从1到32T的数据存储空间 ♦ 单发和多(分段)倍记录模式更多信息请加weixin-pt890111获取 连续(无丢失)数据记录可保证的传输流速高达3GByte/s 一体化系统解决方案 从1到32T的数据存储…