当前位置:首页 > 技术知识 > 正文内容

Unity开发者必看!掌握MVC、MVP、MVVM三大架构模式开发效率翻倍

在Unity开发中,良好的架构设计是确保项目可维护性、扩展性和团队协作效率的关键。

今天,我们就来和「字符无限科技」深入探讨三种经典的架构模式:MVC、MVP和MVVM。

无论你是Unity新手还是资深开发者,掌握这些模式都能让你的项目开发更加高效、清晰。

这些架构模式,不仅在前端、移动端广泛使用,在Unity项目中也能发挥巨大作用,虽然Unity项目中很难像软件开发一样严格的践行这些架构,但是学习它们也能给我们在游戏架构上提供参考价值。

三种架构模式概述


MVC(Model - View - Controller)

MVC是最早被广泛使用的架构模式之一,它将应用程序分为三个主要部分;

Model:主要是数据管理和后台部分业务逻辑,体现在系统中一般是后台程序,尤其是与数据库交互部分。

View:展示给用户的页面部分,体现在系统中一般是前台页面,或者是其他与用户交互的页面。

Controller:接受用户输入,处理请求,调用后端处理用户交互的接口。

调用流程

用户操作:点击UI按钮

View:将点击事件传递给Controller(通过事件或委托)

Controller:处理业务逻辑,操作Model

Model:更新数据并通知View(可能通过事件、回调或直接访问)

View:接收数据更新并刷新UI展示

优点:

  • 分离关注点,将应用程序分为三个独立的部分,每个部分负责不同的功能。使得代码更加模块化和可维护,降低耦合度。
  • 将业务逻辑(控制器)和界面逻辑(视图)分离,可以提高代码的重用性。比如,同一个控制器可以用于不同的视图,同一个视图也可以使用不同的控制器。
  • 模型、视图和控制器可以分别进行单元测试,它们之间的关系是松散的,测试更灵活。

缺点:

  • 模型和视图的耦合度降低了。但是视图和控制器是紧密耦合的,因为视图需要直接调用控制器来处理用户输入。所以还是存在耦合度高的问题。
  • 如果是复杂的应用,控制器往往会变得臃肿,包含大量的业务逻辑和视图逻辑。会导致控制器的难以维护和测试。

适用场景

MVC适用于大多数Unity项目,特别是那些需要清晰分离数据和界面、注重代码可维护性的项目。

例如,在一个简单的射击游戏中,玩家得分、生命值等数据存储在Model中,得分和生命值的UI显示由View负责,而玩家射击、受到伤害等操作则由Controller处理。

MVP(Model - View - Presenter)

MVP是对MVC的改进,主要区别在于引入了Presenter来替代Controller。Presenter直接与View交互,并负责调用Model中的逻辑。

Model:同MVC,负责后台数据和业务逻辑。

View(接口):用户看到的页面层,但是主要是页面,只有少量的交互逻辑。

Presenter:Persenter接收来自View层的用户输入,并且执行业务逻辑,更新View和Model。

调用流程

用户操作:点击UI按钮

View:将事件传递给Presenter(通过接口)

Presenter:处理业务逻辑,调用Model获取或变更数据

Model:处理数据逻辑

Presenter:将数据返回给View(通过接口)

View:根据Presenter的结果更新界面

优点:

  • 解决了MVC中Controller和View过度耦合的缺点,职责划分明确,更利于维护。
  • presenter承担了view和model之间的交互,满足了单一职责原则,视图数据逻辑是清晰的。

缺点:

  • 当项目越来越复杂时,接口数量变多,Presenter层也将变得越来越臃肿。
  • Presenter 层直接持有 View 层,视图改变,Presenter也需要跟着改(代码逻辑、数据)。

适用场景

MVP适用于那些需要高度解耦、注重可测试性的Unity项目。

例如,在一个复杂的策略游戏中,游戏逻辑复杂,需要频繁地进行单元测试以确保各个模块的正确性,使用MVP架构可以方便地对Model进行测试,同时保持View和Model的独立性。

MVVM(Model - View - ViewModel)

MVVM是Model-View-ViewModel的简写。利用数据绑定机制自动同步 View 与 Model。

Model:同MVC,也是负责后台数据和业务逻辑。

View:同MVC,展示给用户的页面。

ViewModel:通过双向数据绑定机制,自动同步视图和模型之间的变化,减少了手动更新DOM的操作。

如果你熟悉其他前端开发的话,会发现Angular / Vue / Flutter采用的都是这种模式。

调用流程

用户操作:点击UI按钮(或输入数据)

View:通过数据绑定(Binding)自动修改ViewModel中属性

ViewModel:属性变化被监听(INotifyPropertyChanged)

Model:ViewModel调用Model获取或更新数据

ViewModel:数据处理完成后,属性自动更新

View:通过数据绑定,UI 自动响应变化

优点:

  • 低耦合,视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  • 可重用性,可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
  • 独立开发(前后分离),开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。
  • 可测试,界面向来是比较难于测试的,而现在测试可以针对ViewModel来写。

缺点:

  • 过于简单的图形界面不适用,增加开发成本(之前Click事件直接搞定,现在需要绑定Command和传参)。
  • 对于大型的图形应用程序,视图状态较多,ViewModel的构建和维护的成本都会比较高。

适用场景

MVVM适用于那些需要高度解耦、注重数据驱动和可维护性的Unity项目。

例如,在一个需要频繁更新UI、展示大量数据的游戏中,使用MVVM架构可以方便地实现数据绑定和UI更新,提高开发效率和代码质量。

MVC、MVP、MVVM的核心区别

我们来对比一下它们之间的一些核心差异:

对比点

MVC

MVP

MVVM

View 与 Model 是否解耦

视图更新方式

Controller 手动更新 View

Presenter 调用 View 接口

ViewModel 数据绑定

是否支持双向绑定

对测试的支持

一般

适合场景

简单 UI 系统

中等复杂交互

大量数据驱动的 UI

在Unity开发中,选择合适的架构模式至关重要。MVC、MVP和MVVM各有优势和适用场景,开发者可以根据项目的具体需求和团队的技术栈来选择最合适的架构模式。

无论选择哪种架构模式,关键在于理解其核心思想,合理划分组件职责,保持代码的低耦合性和高可扩展性,从而构建出高效、可维护的Unity应用程序。

在实际的项目中,也不要刻意的要使用某种架构,架构之间其实没有好坏之分,只有合适与不合适的区别。

相关文章

Axure操刀微信H5页面之《人际沟通风格测试》的制作过程

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。在之前的文章中我就讲过用Axure制作H5页面(再次声明Axure输出的html文件可能并非基于html5),在H5制...

Axure原型:化妆镜商城Web高保真原型+线框图

之前给大家分享了化妆镜商城APP高保真原型,继续给大家补充该原型的Web版。也顺便分享一个化妆镜商城web版的线框图。关于线框图的绘制几乎都是经验的总结,开始时建议大家用铅笔白纸绘制,初版概念确定后再...

去哪儿暑期PM实习一月记:在互联网公司做产品实习是怎样一种体验

人人都是产品经理旗下【起点学院】推出产品经理“365天”成长计划,BAT大牛带你学产品! 在毕业前的最后一个暑假,缘分使然找了几个月暑期实习之后进入了去哪儿,申请提前入职工作至今正好满一个月。原先有在...

Objective-C :Category(category什么意思)

Category 引入在日常的开发中,可能会碰到这样的需求:给某个类增加方法。比如说,需要给NSString类增加一个打印的方法。当然,我们可以新建一个类比如TestString,并继承NSStrin...

记录程序第一天挖漏洞的过程(挖漏洞需要学什么语言)

第一个漏洞复现fastjson漏洞说明:在本地这个fastjson会出现问题复现的过程生成一个java文件进行攻击注入的方式javac Exploit.java但是必须编译成.class文件才能执行p...

Django 官方推荐的姿势:类视图(django类视图和函数视图哪个好)

作者:HelloGitHub-追梦人物在开发网站的过程中,有一些视图函数虽然处理的对象不同,但是其大致的代码逻辑是一样的。比如一个博客和一个论坛,通常其首页都是展示一系列的文章列表或者帖子列表。对处理...