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.hqwc.cn/news/492646.html

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

相关文章

不会PS怎么抠图换背景?推荐两个AI抠图方法

在数字化创意的世界里&#xff0c;我们常常被那些精美的图片所吸引&#xff0c;但有时候&#xff0c;我们更希望将图片中的某个元素单独提取出来&#xff0c;以便进行更深入的编辑、更自由的创作。此时&#xff0c;抠图软件便如同一位精湛的雕刻家&#xff0c;将图片中的细节一…

编程的基础:理解时间和空间复杂度

编程的基础&#xff1a;理解时间和空间复杂度 时间复杂度空间复杂度示例常数时间复杂度 O(1)线性时间复杂度 O(n)线性对数时间复杂度 O(n log n)二次时间复杂度 O(n^2)指数时间复杂度 O(2^n) 空间复杂度示例常数空间复杂度 O(1)线性空间复杂度 O(n)线性对数空间复杂度 O(log n)…

Jmeter学习系列之八:控制器Controllers 的入门介绍

一、Controllers 简介 Jmeter有两种类型的控制器&#xff1a;Samplers&#xff08;取样器&#xff09;和Logical Controllers&#xff08;逻辑控制器&#xff09;&#xff1b;它们驱动着测试的进行取样器&#xff1a;让jmeter发送请求到服务器以及接收服务器的响应数据逻辑控制…

字节、腾讯、华为等50家大厂年终奖曝光,技术岗依旧很吃香!

一、大厂年终奖发放时间与数额 每到年末&#xff0c;年终奖就成了大家关心的话题&#xff0c;今年情况怎么样呢&#xff1f; 我们来看看互联网大厂的年终奖就知道了&#xff0c;先来看看发放时间。 一般来说&#xff0c;大厂年终奖发放多集中在12月-2月发放。 从上图一些网友…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

3分钟快速实现串口PLC远程下载程序操作说明

3分钟快速实现串口PLC远程下载程序操作说明 搜索蓝蜂物联网官网&#xff0c;即可免费领取样机使用&#xff01;&#xff01;先到先得&#xff01;&#xff01;&#xff01; 一. 适用产品型号 其余型号网关此功能正在开发中&#xff0c;敬请期待。 二. 远程下载功能使用流程 …

基于STM32的儿童智能安全防护书包设计

一、前言 1.1 项目介绍 【1】项目功能介绍 随着社会的进步和科技的发展&#xff0c;儿童安全问题日益引起广泛关注。在日常生活中&#xff0c;尤其是在上学放学途中、户外活动时&#xff0c;儿童走失事件时有发生&#xff0c;给家庭和社会带来了极大的困扰和担忧。随着学业负…

ad如何生成gerber文件

1 2 3 4 5 6 7 8![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f576afa92b054a5ca68bc383a4c3c27d.png#pic_ce 8 9 10

乡村研学|乡村研学小程序|基于微信小程序的乡村研学平台设计与实现(源码+数据库+文档)

乡村研学小程序目录 目录 基于微信小程序的乡村研学平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;乡村研学管理 &#xff08;2&#xff09;商品信息管理 &#xff08;3&#xff09;商品类型管理 …

C++ 入门(六)— 调试程序(Debugging)

文章目录 语法和语义错误调试(Debugging)调试过程调试策略常用的调试策略更多调试策略 使用集成调试器步进&#xff08;Stepping&#xff09; 语法和语义错误 语法错误 编写根据 C 语言的语法无效的语句时&#xff0c;会发生语法错误。例如缺少分号、使用未声明的变量、括号或…

Docker Nginx 负载均衡搭建(服务宕机-配置高可用) - 附(Python案例,其它语言同理)

目录 一 . 概要 1. 什么是负载均衡 2. 负载均衡有哪些优势&#xff1f; &#xff08;1&#xff09;应用程序可用性 &#xff08;2&#xff09;应用程序可扩展性 &#xff08;3&#xff09;应用程序安全 &#xff08;4&#xff09;应用程序性能 3 . Nginx负载均衡调度策…

【力扣白嫖日记】180.连续出现的数字

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 180.连续出现的数字 表&#xff1a;Logs 列名类型idintnumvarchar 找出所有至少连续出现三次的数字。 返回…