MVC模式
MVC模式概述
MVC是(Model、View、Controller)三个单词的首字母简写,其应用的目的是为了将程序分层,便于应用程序的分层开发。
- Model (模型)代表一个存储数据的对象,它也可以带有少量的逻辑,在数据有变化的时候通知Controller进行更新视图
- View(视图)代表模型包含的数据的可视化表现
- Controller(控制器)控制器控制数据流向模型对象,并在数据变化时更新视图。它使得视图于模型分离开。
Unity游戏项目中的MVC模式
以一个MMORPG背包系统为例,玩家可以在游戏主界面按背包按钮打开背包,背包中的数据来源于服务器,背包有自动整理、显示物品信息等等交互功能。我们用英文Pack来代表背包,应用于相应的Model、View、Controller类的命名。
View
将面板PackView制作成Prefab,面板PackView的GameObject挂载PackView.cs,在PackView.cs中获取各个面板组件的引用,例如该面板的一些按钮,并在PackView.cs中定义这些按钮的回调函数(例如背包系统中子面板的呼出)
Model
PackModel的初始化
PackModel类使用单例模式(针对MMORPG游戏特性,每个玩家客户端只维护该玩家的背包数据)。
PackModel职责
在PackModel中定义玩家持有物品的列表的数据存储结构、对数据操纵的函数以及向PackView传入数据更新表现等等。
向PackView传入数据的方式不止一种,例如
- PackModel存放PackView的引用
- PackModel发送被PackView监听的消息类型
Controller
PackController的初始化
对于MMORPG来说,一般在游戏初始化的时候实例化不同模块的Controller类,背包系统作为一个模块,其Controller类也是在游戏初始化的时候被实例化。
PackController的职责
Controller类负责的是控制数据流流向模型对象,其中数据流来自游戏服务器。同时,Controller也是由User进行更新的,它也处理玩家的交互事件,例如点击背包按钮将背包面板调出。
故Controller会持有View和Model的引用,同时会注册网络协议回调事件将网络数据更新至Model中,并注册玩家的点击事件回调事件,需要注意的是,虽然Controller持有View的引用,但是个人觉得不应该由Controller来更新View,因为View所需要的数据只有Model知道,所以觉得应该由Model来驱动View更新其表现会比较好。