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

文章目录

什么是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
        /Model
            GameModel.cs
        /View
            GameView.cs
        /Controller
            GameController.cs
2. 实现模型
csharp 复制代码
// 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. 实现视图
csharp 复制代码
// GameView.cs
using UnityEngine;
using UnityEngine.UI;

public class GameView : MonoBehaviour
{
    public Text scoreText;

    public void UpdateScore(int score)
    {
        scoreText.text = "Score: " + score;
    }
}
4. 实现控制器
csharp 复制代码
// 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

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

相关推荐
重生之绝世牛码27 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
shinelord明1 小时前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
goTsHgo1 小时前
在 Spring Boot 的 MVC 框架中 路径匹配的实现 详解
spring boot·后端·mvc
飞的肖1 小时前
前端使用 Element Plus架构vue3.0实现图片拖拉拽,后等比压缩,上传到Spring Boot后端
前端·spring boot·架构
小屁不止是运维2 小时前
麒麟操作系统服务架构保姆级教程(五)NGINX中间件详解
linux·运维·服务器·nginx·中间件·架构
程序猿进阶2 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
Hacker_Fuchen3 小时前
天融信网络架构安全实践
网络·安全·架构
ProtonBase3 小时前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
大圣数据星球6 小时前
Fluss 写入数据湖实战
大数据·设计模式·flink
思忖小下7 小时前
梳理你的思路(从OOP到架构设计)_设计模式Template Method模式
设计模式·模板方法模式·eit