一.写在前面
通过前面的几篇,我们已经大概了解了Photon客户端与服务端的通信并对日志进行了介绍.结合和本系列一起更新的FluentNHibernate初探系列即可以进行一般性的游戏开发了.
二.客户端和服务端的通用部分
我们建立一个类库项目,将服务端和客户端需要进行通讯的数据类型存储在这里,包括操作代码(OperationCode),参数的增加和提取(ParameterTool.GetParameter<T>和ParameterTool.AddParameter),以及参数的代码(ParameterCode)等.此外,数据库中的数据类型(DBModel)也放在这里.
其结构如下图:
Model中是和数据库中表对应的类,除开一个工具类之外,其它的都是枚举类型.暂时所用到的结构就是这样.
三.客户端架构
客户端的服务器部分通过不同的控制器对外提供调用,完成和服务器的通信.
类间关系如图:
图中的类里,PhotonEngine是继承了MonoBehavior类和IPhotonPeerListener接口的单例类,会在Awake函数中连接服务器,在Update函数中调用PhotonPeer的Service函数来向服务器发送Request,并接受服务器的Response.值得注意的是在场景加载时要确保不会被销毁以防止连接断开.
ControllerBase是抽象类,继承自MonoBehavior.在Start函数执行时将在PhotonEngine中注册.当PhotonEngine得到Response之后,会根据OperationCode调用已注册的相应的Controller.在Destroy函数中,会取消在PhotonEngine的注册记录以防止出现找不到引用的bug.各个不同的Controller就会对不同的操作进行处理.
四.服务端架构
服务端有一个继承了ApplicationBase的ArpgApplication类,还有一个继承了PeerBase的ClientPeer.服务端接收到了连接的请求后会创建ClientPeer,接受Request和发送Response的函数都在ClientPeer中.
主要结构如下图:
此结构中所有的Handler与服务端的Controller对应,一个Controller对应一个Handler,他们之间处理相应的Request和Response.在服务端调用的时候,先是ClientPeer接收到Request,然后根据OperationCode,判断该调用哪个Handler,在ArpgApplication中找到对应的Handler,然后把Request发给它让它进行处理,返回处理的结果Response,发送给客户端.
在Handler处理的过程中,一般都会需要对数据库进行操作,所有的操作都封装在DB.Manager中,对相应的数据库操作调用相应的的Manager中的方法即可.
五.结语
以上涉及到了三个项目的开发,其中用来类库项目Common是用来约定服务端与客户端的传递参数结构用的,类似一个协议.客户端对外提供各种方法以方便其它模块调用.服务端借助FluentNHibernate框架对数据库进行操作以响应客户端的请求.