当前位置: 首页 > news >正文

【Unity设计模式】Unity MVC/MVP架构介绍,及MVC/MVP框架的简单应用

文章目录

  • 什么是MVC?
  • MVC眼花缭乱设计图
  • MVP和MVC
  • 最经典的MVC的业务流程
  • 最简单的Unity MVC 框架示例
        • 1. 创建项目结构
        • 2. 实现模型
        • 3. 实现视图
        • 4. 实现控制器
        • 5. 使用示例
  • 总结
  • 参考
  • 完结

什么是MVC?

MVC自1982年被设计出来,至今都有着很大比重的使用率,特别是目前软件及游戏迭代如此之快的情况下。高效的增删功能,低耦合又小巧灵活的框架MVC,深受广大ProgramDesigner的喜爱。

MVC框架相信大部分程序员(尤其做前后端的)都不会陌生。MVC的全称是Model-View-Controller(模型-视图-控制器),比如php非常火的thinkphp和laravel框架就是典型的MVC架构。

MVC(Model-View-Controller)是一种软件架构模式,MVC 背后的一般思想是将软件的逻辑部分 与数据 和UI(显示窗口) 分开。这有助于减少不必要的依赖关系。将应用程序分为三部分:

  1. Model(模型):负责数据和业务逻辑。它管理应用程序的状态和数据。
  2. View(视图):负责用户界面和用户交互。它展示数据并响应用户输入。
  3. Controller(控制器):处理用户输入并更新模型和视图。

MVC眼花缭乱设计图

我们从网上搜索mvc相关资料时,如果你多看几篇文章的话可能会发现,好像他们介绍的设计图都不太一样,这里罗列了大部分的设计图
在这里插入图片描述
到底上面列出的设计图哪个才是对的。其实都是对的。为什么这么说呢,这得从mvc的发展说起。
MVC框架模式最早由Trygve Reenskaug 于1978年在Smalltalk-80系统上首次提出。经过了这么多年的发展,当然会演变出不同的版本,但核心没变依旧还是三层模型Model-View-Control。

MVP和MVC

看了不少的文章,发现每个人对MVC/MVP看法都不一样。

我觉得可以这样简单的总结一下,MVP原本是MVC的一种模式变体,随着时间推移,MVC和MVP的边界确实越来越模糊。现在其实已经很难区分出MVP了,许多开发者根据项目需求和个人经验灵活调整这两种模式,形成了各自的“MVC”版本。

但是MVC的底层逻辑是不变的,都是为了实现关注点分离,提升代码的可维护性和可测试性。通过将数据、业务逻辑和用户界面分开,开发者能够更容易地管理复杂性、进行单元测试和实现代码复用。

这种灵活性使得架构设计更具适应性,但也可能导致代码风格不一致,因此在团队中保持一致性和沟通很重要。

最经典的MVC的业务流程

在这里插入图片描述

最简单的Unity MVC 框架示例

下面是一个简单的 Unity MVC 框架实现。

1. 创建项目结构
/Assets/Scripts/ModelGameModel.cs/ViewGameView.cs/ControllerGameController.cs
2. 实现模型
// GameModel.cs
using System;[Serializable]
public class GameModel
{public int Score { get; private set; }public void IncreaseScore(int amount){Score += amount;OnScoreChanged?.Invoke(Score);}public event Action<int> OnScoreChanged;
}
3. 实现视图
// GameView.cs
using UnityEngine;
using UnityEngine.UI;public class GameView : MonoBehaviour
{public Text scoreText;public void UpdateScore(int score){scoreText.text = "Score: " + score;}
}
4. 实现控制器
// GameController.cs
using UnityEngine;public class GameController : MonoBehaviour
{private GameModel model;private GameView view;private void Start(){model = new GameModel();view = GetComponent<GameView>();model.OnScoreChanged += view.UpdateScore;// 示例:增加分数model.IncreaseScore(10);}private void Update(){// 示例:监听输入增加分数if (Input.GetKeyDown(KeyCode.Space)){model.IncreaseScore(1);}}
}
5. 使用示例
  1. 创建一个新的 Unity 场景。
  2. 创建一个空 GameObject,命名为 GameController,并添加 GameController 脚本。
  3. 创建一个 UI Text 元素并命名为 ScoreText,将其拖放到 GameView 脚本的 scoreText 字段。
  4. GameView 脚本附加到 GameController GameObject 上。
  5. 运行场景,按空格键以增加分数。

总结

这个简单的 Unity MVC 框架示例展示了如何将模型、视图和控制器分离,使得项目结构清晰,易于维护。在更复杂的项目中,可以扩展这个框架来处理更复杂的逻辑和交互。

MVC只是程序框架中的其中一种,其实每个架构师脑子里都存着很多说不出名字的框架,这就是为什么人家叫架构师,你叫程序员的原因。有一个好的程序框架,比糊里糊涂的写代码强千万倍,灵活迭代、高效编码,只要你想,你就可以。

这里主要只是为了介绍unity中mvc的简单使用,但于我看来,在游戏项目中mvc框架并不非常适用,MVC是ui专用的模式,游戏不同于web前端,不同类型的游戏其架构相差非常之大(比如棋牌类游戏,rpg游戏,moba类游戏,跑酷类游戏之间的差别) ,所以游戏中mvc不同的层很难有非常清晰的定义。并不是说MVC在游戏项目中完全没用,但只有它还远远不够。游戏项目最合理的方式是由主程根据项目需求制定一套新的结构和各部分的依赖关系,并事先想好各部分的扩展和通信方式。

参考

https://unity.com/cn/how-to/build-modular-codebase-mvc-and-mvp-programming-patterns
https://blog.csdn.net/qq_39574690/article/details/80757261
https://www.jianshu.com/p/acc689be52f9
https://blog.csdn.net/milu_ELK/article/details/139920815
https://blog.csdn.net/singwhatiwanna/article/details/80904132

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • json格式互相转换
  • [论文笔记] 多语言配比的自动化超参搜索
  • 第三讲 part 2:LINK3D原理 - 代码 - 自定义内容
  • 【VUE】vue-router
  • 在虚幻引擎中实时显示帧率
  • 【计算机网络 - 基础问题】每日 3 题(二十)
  • nginx+keepalived健康检查案例详解(解决nginx出现故障却不能快速切换到备份服务器的问题)
  • 也遇到过 PIL Image “image file is truncated“的问题
  • 锤炼核心技能以应对编程革命
  • AndroidLogger插件使用技巧
  • JW01二氧化碳传感器(串行通信 STM32)
  • Linux:八种重定向详解(万字长文警告)
  • 低代码中实现数据映射的必要性与方案
  • 【计网】从零开始掌握序列化 --- 实现网络计算器项目
  • 细说硫酸钙防静电地板的材质结构和优势特点
  • .pyc 想到的一些问题
  • Centos6.8 使用rpm安装mysql5.7
  • co模块的前端实现
  • express.js的介绍及使用
  • java小心机(3)| 浅析finalize()
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS专题之继承
  • MaxCompute访问TableStore(OTS) 数据
  • MySQL几个简单SQL的优化
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spring声明式事务管理之一:五大属性分析
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 初探 Vue 生命周期和钩子函数
  • 回流、重绘及其优化
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 巧用 TypeScript (一)
  • 使用 QuickBI 搭建酷炫可视化分析
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ionic入门之数据绑定显示-1
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​数据链路层——流量控制可靠传输机制 ​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #14vue3生成表单并跳转到外部地址的方式
  • #includecmath
  • $NOIp2018$劝退记
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (c语言+数据结构链表)项目:贪吃蛇
  • (LeetCode) T14. Longest Common Prefix
  • (二) 初入MySQL 【数据库管理】
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • *1 计算机基础和操作系统基础及几大协议
  • . NET自动找可写目录
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET 设计一套高性能的弱事件机制