作为一个大型游戏,不可避免需要使用复杂的界面、网络消息处理、数据缓存等一些略微复杂的东西。其实我们都知道,对于一个手游来说,庞大的系统工程下面,其实是大量基础的技术的堆叠。于是在游戏开发中,出现各类的Bug其实并不是因为技术上的实现出现问题,而是从框架、代码的管理上出现设计失误。
针对以上问题,众多软件设计者做出努力,设计出了很多中逻辑清晰的框架模式结构,这里我介绍在我们项目中使用的MVC设计模式。
MVC的概念
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
为什么在Unity3d中使用MVC?
这里我们有一个登录界面(gif图请耐心等待加载),我们点击登录之后,需要网络发包到服务器。服务器收到数据包之后,进行帐号密码对比。然后返回数据到客户端,然后客户端弹出提示框提示登录结果。
[图片上传失败...(image-67433e-1539180638206)]
单一逻辑的客户端模式
从逻辑简单的层面来讲,我们可以按照下面的方案来做。
单一逻辑的客户端模式,网络逻辑 和 UI事件都放在UI 逻辑处理类中进行处理。
针对上面的登录逻辑,我们有以下 Class
LoginWindow — 负责处理界面点击、滑动、输入事件 及 注册网络回调、处理网络消息。
CCNetworkClient — 负责Send 、Receive 网络数据 及 网络数据分发。
在简单的工程中,这种框架方案无意最适合,省时省力,一眼就看懂。
但是在大型游戏和工程中,代码量太大,用单一逻辑的客户端模式,管理起来力不从心,不好维护。于是我们引入MVC模式
Unity3d 中的MVC框架模式
在Unity3d中,由Model 通知 View 的方式可以有两种,使用SendMessage 和 使用Delegate 。从而引出了标题中的基于网络使用SendMessage 及 基于网络使用Delegate的客户端MVC框架模式。
对于MVC框架模式,我们有以下Class
LoginWindow — 负责UI 界面 Event 发出已经 View的更新。
LoginModel — 负责注册网络回调,处理网络消息。
CCNetworkClient — 负责Send 、Receive 网络数据 及 网络数据分发。
基于网络使用SendMessage的客户端MVC模式
在接收到网络数据 (ReceiveNetworkPacket ) 之后,Network(Client) 进行数据分发 ProcessNetworkEvent 。进而处理之前Model 中注册的网络事件 (RegisterNetworkEvent )。
如果需要更新 UI ,通过gameObject.SendMessage 来通知 UI 更新。
基于网络使用Delegate的客户端MVC框架模式
对于一款ARPG游戏来说,游戏的流畅度在一定程度上决定了工作室收入。运行速度上的优化不仅要从内存、CPU、GPU上,对自己的逻辑编码、图集使用等去分析,对Unity系统API的选择也要进行优化考虑。
GameObject.SendMessage() 是一个效率较低的API,我们使用 Delegate 替换掉它。引入Delegate 。
在Model发送网络数据时,把注册的UIEvent 也发送到服务器。服务器原样返回 。
在Model 接收到数据需要更新 UI 界面时,使用 之前 注册的UIEventDelegate 来进行更新。