海外项目很多游戏使用Photon云服务代替我们常用的游戏Server, 使用photon 可以不做服务器开发,只转发消息。 但是这个在国内却面临许多问题,比如网络支持不好,破解盗版等问题。所以我们需要拿掉photon走我们自己的服务器做消息转发。
背景:
我们项目是拿到海外项目做本地化二次开发的Unity项目。有手游,端游转手游等不同类型的。但是我们拿到这两个项目都有个共同点,都是使用的Photon做服务器。
https://www.photonengine.com/zh-CN/PUN
Photon优点:
Photon是比较成熟的商业网络服务,从MMO到FPS都有相关案例,支持2人~100人在同一个房间。组件式调用,灵活多变,添加快速简单,自己添加修改很快就可以成型上线跑。省去自己开发搭建服务器的过程,可随时方便拓展服务器等等,而且网上有很多资料分析和使用介绍。
图片来源: https://steven-net.medium.com/
Photon缺点:
首先是考虑到国内玩家防作弊,由于Photon是所有逻辑都写在客户端,客户端是比较容易破解的,虽然我们也使用了易盾加固,乐变,Anti-Cheat Toolkit 加密变量 等手段,可是上线以后还是被玩家使用各种工具开挂等操作,破坏游戏平衡和营收。还有就是上线后各种活动更新调整,使用自己的服务器也会更加灵活。另外Photon服务器在国内部分地区不是很稳定。玩家数据存储也得依赖第三方服务器,游戏使用Host模式的,不能避免主机顽家掉线弱网,改客户端内存等操作。 所以我们综合考虑,替换掉原有的Photon服务,改用我们自己开的服务可以更好的解决上述问题。
替换思路 :
由于Photon是在项目开发的各个地方都可能用到,对项目代码嵌入很深,势必会大量改动现有代码逻辑。但好在项目A是一款2D休闲游戏,Photon使用整体不复杂, 主要是使用的转发消息功能。项目B由于是端游3D项目改手游,代码体量相对较大,对Photon使用更多更频繁,所以经过综合评估后,决定加在Photon Client一个代理层 跟我们的服务通信, 原有的调用逻辑不动。
1.直接移除Photon插件的所有相关代码。模仿Photon的接口自己写一套跟服务器消息转发流程。
2.不移除插件,在Photon的框架基础上,添加代理层,好处是减少原有代码逻辑的改动。
1,项目A
完全删除photon插件,模拟photon 转发逻辑。
我们的服务器架构是使用的分布式全球同服微服务架构,所以整体上是逻辑分为两块,战斗外和战斗内。
战斗外使用战斗外逻辑使用Http+Json ,并带一个TCP+json的通知服,这块主要是玩家各类属性升级,活动信息等功能为主。
通过匹配服匹配后进入战斗服。
战斗内使用TCP+protobuf,进入战斗房间以后,为了不大幅改动原有战斗内代码。使用OPT消息来转发各类战斗内消息,这部分服务器还是主要模拟Photon做转发就好了。 战斗匹配到进房间,和结算走们自有的流程。
2,项目B
不移除插件,在photon的框架基础上,添加代理层。
这部分匹配和进房间流程和消息转发流程跟项目A差别不大。由于PUN Client插件是在Unity直接以源码形式呈现的,虽然有些接口不开放,但是我们可直接修改扩展,将一些接口暴露出来然后再用就好了。接下来主要是需要重写模拟Photon的消息转发RPC ,OnEvent,TransferOwnership.,PhotonView.IsMine, PhotonNetwork.IsMasterClient ,属性传递,序列化反序列化等问题一一处理掉。 这样我们就是实现了尽量少的改动原有代码逻辑,而替换的掉服务器的效果。