|
游戏杂谈:为何很多单机游戏也有着联网功能
法师猫不凡 写于2023.3.28
之所以很多单机手游,也有着联网功能,是因为需要防止玩家对游戏的破解和修改。我举几个例子吧:
- 当初的《龙族OL》,本来是一款很好的南朝鲜网络游戏。结果就因为没有服务器端验证,外加数据储存在本地,导致有玩家发现居然能用金山游侠修改游戏数据,然后一夜之间,所有玩家的装备、等级全满,最终游戏也很快就此完蛋。
- 《部落冲突》在很久之前,是有着对战时玩家掉线,可以断续重连的机制的。而在这里,其实游戏就默认了在玩家没有网络信号阶段,是处于单机状态的。但游戏仍然允许玩家在3分钟内,只要能获得信号,可以继续进行游戏。而有的人就钻了游戏的漏洞,用辅助工具中的模拟功能,获取不正当游戏利益。之后,游戏更新改掉了这个问题,代价是玩家对战时掉线,不再有断续重连的功能。
换言之,很多游戏必须玩家联网,最重要的目的,就在于防止玩家在不联网的情况下,通过破解或修改器,修改掉本地的游戏数据。
单机游戏,玩家随便修改自然无所谓,因为玩家已经提前付费买单了。而手游和网游则不然。试想,玩家随便修改等级、属性、装备,宝石,那么商城内的氪金道具谁还会花费大笔金钱购买,谁还会付费大笔氪金?换言之,如果没有联网功能,就无法通过实时监测,查验玩家的数据是否有异常的改动。一旦玩家修改,那么游戏损失就太大了,游戏可能会直接完蛋。
而在程序具体的运行过程中,服务器端是通过回调系统和心跳频率来处理各类事件的。其中,实体对象定义所有事件回调,并在回调的响应函数中统一提给回调系统处理。回调系统收到请求后,则向注册了此实体功能的对象分发。而功能对象之间通过“虚接口”实现彼此间的调用,如战斗中要调用物品掉落的功能;之后,再通过功能对象实现实体对象的互动,如战斗功能实现角色/场景/NPC间的战斗,移动功能实现角色/NPC的寻路等。至于心跳函数,可独立定义在功能对象中,定时检测(例如每3秒自动检测一次,若条件满足则触发事件效果),不过心跳效率稍低,且如果数量太多极易占据大量系统资源,因为心跳是定时检测的。
而游戏中的客户端结构,则包括以下几个方面:
- 控件模块:主要同UI界面和操作相关,包括控件、界面、鼠标、控制、TIPS显示等方面。
- 引擎相关:包括动作、特效、碰撞检测、粒子、寻路、声音、天气、动态灯光、模块读取等方面。
- 界面逻辑:包括登陆逻辑、切场景逻辑、游戏内部界面逻辑、界面辅助逻辑(例如冷却、快捷栏等方面)等。
- 游戏逻辑:包括角色、场景等同游戏逻辑相关的方面。
- 其他模块:更细分的还有特效模块,网络消息模块等。
换言之,客户端的功能主要是画面显示,各类资源的正确显示(如UI、特效、动作、各种控件、声音、角色模型、场景资源等)、音效(音乐和音效、语音、过场动画),以及其他的一些功能组成。
综上所述,网络游戏的服务器端,一般存放各类重要数据,以及各类重要的逻辑判断和检测所需的功能模块。且主要通过回调系统和心跳频率来处理问题,并进行客户端与服务器端的数据检查与认证。而客户端主要存放各种美术、音乐音效、界面上的资源。
而一旦游戏检测发现玩家客户端的数据,与服务器端的数据不一致,那么往往会以服务器端的数据为准。这也是为何玩家有时候玩游戏,会发现掉线后,数据会回档的原因。这也是很多游戏需要玩家联网的原因。 |
|