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

devtools/2024/9/22 20:46:08/

文章目录

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

参考

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

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


http://www.ppmy.cn/devtools/115638.html

相关文章

2.数据库-第二章数据库数据管理

2.数据库-第二章数据库数据管理 文章目录 2.数据库-第二章数据库数据管理DML1.新增:2.修改&#xff1a;3.删除&#xff1a; DML 1.新增: ​ insert into 表名[(列1,列2…)]values(值1,值2) 当出现多条插入时 使用逗号,隔开 inser into grade(GradeName) values("S1&qu…

OpenAI GPT o1技术报告阅读(4)- 填字游戏推理

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个填字游戏的案例。 我们先看下问题&#xff1a; 解决以下填字游戏&#xff1a; Across&#xff08;横向&#xff09…

【数据结构】排序算法---归并排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言——迭代版C语言——递归版PythonJavaC——迭代版C——递归版Go 结语 1. 定义 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff0…

linux下共享内存的3种使用方式

进程是资源封装的单位&#xff0c;内存就是进程所封装的资源的一种。一般情况下&#xff0c;进程间的内存是相互隔离的&#xff0c;也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存&#xff0c;那么必须要进过内核这个桥梁&#xff0c;这就是…

React js Router 路由 2, (把写过的几个 app 组合起来)

完整的项目&#xff0c;我已经上传了&#xff0c;资源链接. 起因&#xff0c; 目的: 每次都是新建一个 react 项目&#xff0c;有点繁琐。 刚刚学了路由&#xff0c;不如写一个 大一点的 app &#xff0c;把前面写过的几个 app, 都包含进去。 这部分感觉就像是&#xff0c; …

java重点学习-JVM类加载器+垃圾回收

12.7类加载器 JVM只会运行二进制文件&#xff0c;类加载器的作用就是将字节码文件加载到JVM中&#xff0c;从而让Java程序能够启动起来。 类加载器有哪些 启动类加载器(BootStrap ClassLoader):加载JAVA HOME/jre/lib目录下的库扩展类加载器(ExtClassLoader):主要加载JAVA HOME…

运行npm install 时,卡在sill idealTree buildDeps没有反应

一直停留在sill idealTree buildDeps 解决方法 npm config set registry https://registry.npm.taobao.org 配置后用下面命令看是否配置成功 npm config get registry 如果配置还不好使 就执行下行的ssl npm set strict-ssl false 然后执行 npm install 成功执行

JMeter 中使用 Gson 操作请求中的Boby参数

背景 使用org.json.JSONObject 转换&#xff0c;与原Body参数顺序发生变化&#xff0c;原因&#xff1a;JSONObject内部是用Hashmap来存储的&#xff0c;本质上是一个无序的键值对集合&#xff0c;不应依赖字段的添加顺序。 为解决org.json.JSONObject 输出顺序问题&#xff…