前言
MVC是非常经典的分层设计,是时候记录下来了。
什么是MVC
MVC是Xerox PARC在二十世纪八十年代为编程语言Smalltalk-80设计的一种软件框架模式,其中定义了Model-View-Controller三层,这三层分别具有特定职能,使得开发过程变得可控。现已被广泛使用。
MVC的结构
Model
Model的作用是存储游戏对象的核心数据和状态,处理一切数据逻辑。它不直接和View层交互,一般借由事件来分发消息。
View
View的作用是从Model层查询数据状态,并即时更新游戏UI。一般来说就是UI层。
Controller
Controller的作用是接受用户的输入,并把对应命令转递给Model或View,让它们执行对应操作。简单来说,C把各种M和各种V联系起来。
MVC解决了什么问题
显然,它做到了数据和显示的解耦。这是事件驱动的功劳,现在主流的游戏UI更新方式就是事件驱动。
在早期的软件开发中,一份数据要以不同的方式展现出来,即一个M(数据),多种V(展示),很适用于MVC。
MVC的改进方案
PureMVC是一款新式的MVC框架。在传统的MVC框架上,它新增了Proxy、Mediator和Command来辅助MVC三层进行工作。
详情指路->PureMVC--一款多平台MVC框架。
针对Unity的MVC改进方案
Unity With MVC: How to Level Up Your Game Development中提到了他对通用MVC框架的改进,以更好地适应游戏开发的需求:
现在,我想介绍一下对通用 MVC 模式的两个小修改,这有助于它适应我在使用 MVC 构建 Unity 项目时遇到的独特情况:
MVC 类引用很容易分散在整个代码中。 - 在 Unity 中,开发人员通常必须拖放实例以使其可访问,或者通过繁琐的查找语句访问它们。 - 如果 Unity 崩溃或某些错误使所有拖动的引用消失,则丢失引用地狱将随之而来。 - 这使得必须具有单个根引用对象,通过该对象可以访问和恢复应用程序中的所有实例。GetComponent( ... )
某些元素封装了应高度可重用的常规功能,并且通常不属于模型、视图或控制器的三个主要类别之一。我喜欢简单地称这些为组件。它们也是实体组件意义上的“组件”,但只是充当 MVC 框架中的帮助程序。 - 例如,aComponent,它只按给定的角速度旋转事物,并且不通知,存储或决定任何东西。Rotator
为了帮助缓解这两个问题,我想出了一个修改后的模式,我称之为AMVCC,或应用程序-模型-视图-控制器-组件。
想深入了解可以去原博客查看。
非合理不使用
MVC对于响应式交互的UI系统有优势;但对于游戏的其他模块来说,使用MVC可能并不合理。
不同于需求相对固定的其他前端开发,游戏开发的需求复杂多变,开发时根据项目的实际需求来改造或制定框架才是合理的。不要为了用框架而生搬硬套。
参考资料
Unity With MVC: How to Level Up Your Game Development
PureMVC--一款多平台MVC框架
探讨:为什么在游戏开发中不使用MVC?