【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

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

相关推荐
isboyjc5 小时前
Lomo Agent:面向创作型、持续协作 Agent 的架构设计与工程实践
人工智能·架构·agent
心若自由何处是束缚5 小时前
适配器模式:从原理到实战的完整指南
设计模式·适配器模式
聪明的笨猪猪6 小时前
AI应用架构选型:架构师的核心决策困境与权衡
经验分享·面试·架构
疯华整猫8 小时前
被杀掉之后:我把 Android 的「唤起 + 常驻」重做了一遍
前端·面试·架构
Dawson Zhu8 小时前
【LLM推理与Serving⑤】Prefix Cache前缀缓存:让重复prompt不再重复计算
人工智能·语言模型·架构·aigc·agi
薛定谔的悦8 小时前
光储充一体机从主控到执行单元的双层架构
数据库·mongodb·架构
是2的10次方啊9 小时前
设计模式与生活⑮:看到哪儿了,得有个地方替你记着
设计模式
寂寞的船9 小时前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
2601_967979121 天前
设计模式 - 访问者模式
设计模式·访问者模式·应用场景·对象结构·操作分离
国科安芯1 天前
83 倍:ASC0108S 在推挽和开漏之间,差的不是速度,是回程
单片机·嵌入式硬件·架构·电平转换·抗辐射