产业科技创新 Industrial Technology Innovation
68Vol.1 No.23产业科技创新 2019,1(23):68~69Industrial Technology Innovation 论Unity引擎下多人在线网络游戏设计及开发
李 伟
(东江苏普旭软件信息技术有限公司,江苏 南京 210000)
摘要:在数字经济的发展环境中,游戏数字产业一直占据着举足轻重的地位,现阶段大多数人设计与开发的游戏都是单机游戏,而关于多人在线网络游戏则鲜少有人涉猎,下面本文在Unity3D的基础上,与网络通信原理相结合,进一步设计及开发了多人在线动作游戏,并对在线玩家场景方面提出了同步武器、伤害及位置等协议。由于受到网络延迟等因素的影响,系统在实时实现位置同步方面还存在一定难度,对此我们可选择预测式位置同步的方式来帮助缩小运行游戏过程中产生的误差。
关键词:Unity引擎;多人网络游戏;设计和开发
中图分类号:TP391.9 文献标识码:A 文章编号:2096-6164(2019)23-0068-02
从现今社会游戏行业的发展阶段来看,具备强竞技性的已经迈进主流游戏市场,且当前有很多引擎平台
可供游戏开发使用,其中Unity已其可易操作性、跨平台性等优势在众多平台中脱颖而出。下面该文章主要探讨了在Unity引擎之下设计和开发多人在线网络游戏的具体情况,希望能够更好的加快我国网络游戏产业的发展。
1 规划多人在线网络游戏的服务端或客户端一般来说网络游戏服务端主要用来处理各种与游戏相关的逻辑事物、计算各种数值和进行安全验证等。服务端按照设计完毕的协议来接收客户端提供的数据,并根据各自需求加以处理,再把结果发送到相应的客户端。就网络游戏服务器而言,单独服务器的承受力是有限的,游戏不同所需的服务器数量也有所不同,不过服务器不仅是数量增多,更需要按照功能进行分类。具体应遵照如下原则进行划分:
(1)将游戏中过多占据系统资源的功能有效分离出来,形成单独的服务器。
(2)在同一服务器下,尽量重复使用某部分服务器。
(3)划分服务器要确保数据流向足够清晰,严格按照游戏规模跟类型相应缩减或增多服务器数量,以防产生过多数据复制等情况。
(4)在设计游戏时要充分考虑到玩家运行游戏时的数据保存、修改跟流向,实际上这也对划分服务器产生了一定的决定性作用。2 概述关键技术
2.1 登录
玩家点击登录按钮以后,客户端的程序会把相应的账号、密码送至相关的SocketManagement,并将其转为byte[]类别,向服务器端发送,这便是登录按钮的功能。当服务器端收到消息以后会对消息进行验证,再通过服务器端SocketManagement类别将验证结果发至客户端,当客户端看到消息后可展开系列判断跟解析。
2.2 同步数据
3D型多人网游要求数据同步具备实时性,在对战过程中不需要进入像回合制网游那样特殊战斗情境中,而是需要实时将战斗具体进度向其他玩家同步展现出来,由此可见这需要居高的数据同步性,只有这样才能充分确保所有玩家都能通过屏幕看到相同的画面。有效解决同步问题的方式就是向其他玩家分别广播一遍所有玩家的动作,但其中有两项问题,一个是都需要向哪些玩家进行广播,广播什么;另一个就是一旦发生网络延迟会怎么办。对于前者我们可以按照游戏具体要求去解决;而对于后者我们则可以选择预测拉扯的方式,具体而言在预测拉扯中我们可以先定义一个属性值,并将其连接在服务端玩家的类里来表示预测误差。当玩家登陆到游戏中的时候,我们可将服务器跟客户端的时间展开比对,计算出差值。而服务器在广播消息时,需要按照广播内容的TimeModified准确得出客户端CurrentTime,并将这个CurrentTime囊括到消息中,再进行广播。与此同
作者简介:李伟东(1989- ),男,安徽安庆人,本科,助理工程师,主要从事仿真模拟方面研究。
69第1卷 第23期
时在玩家A客户端可创建个队列,保存下来消息,当验证后再从未被验证的消息中删除掉此条消息,如果没有验证成功,就会自动回到A原始状态。当玩家使用的角释放技能时,首先需要将“释放技能”这个消息发到服务器端,客户端同时将释放技能的画面播放出来。其次服务器端再把此消息分别发送给同服务器、同场景的其他玩家,其他玩家的控制器便会实时发送播放该技能动画的消息,也就是我们说的实现同步数据。
2.3 移动同步
移动同步有两种方式,分别是实时同步跟定时同步。
(1)实时同步:这种方式主要指的是任何一个玩家只要出现了位置移动或转向,就需要马上将此消息传送到服务器中,服务器再立刻把玩家移动的消息传送给同场景下的其他玩家。这种方式具备极强的实时性,可是因为服务器承受的压力十分大,所以这种方式更适合场景中人数较少的游戏中,例如《穿越火线》等。
(2)定时同步:这种方式主要指的是固定一秒或几秒的时间来从服务器端收取同一场景下玩家的位置
消息,并按照这些位置消息来将其他玩家消息从客户端显示出来。由此可见这种方式并没有对实时性有太高的要求,可尽可能多的处理玩家场景,如《梦幻西游》在一个场景中可能会存在上万名玩家。
通过对此,我们最终在设计多人网络游戏时选择的方式是实时同步法。
2.4 心跳检测
心跳检测主要指的是在某段时间内客户端向服务器端或者是服务器向客户端发送特殊的Socket讯息,据此来评判服务器端跟客户端之间的连接是否有效。这种固定的周期性和作用性特征就叫做心跳检测。
通过上述可知心跳检测的发送端没有特殊要求,可以是服务器端发起的,也可以是客户端发起的。为尽量缩小服务器的承受压力,我们在设计和开发Unity引擎下多人在线的网络游戏时可以选择客户端发起,服务端负责检测到的形式来进行心跳检测。
具体操作方式是:先在客户端例化个Timer定时器,每隔20 s发送Socket消息给服务器,当服务器端收到消息后再将LastSendTime改成接收时间。其次在服务器端也例化个Timer定时器,一样间隔20 s 发送Socket消息,检测其中的LastSendTime有否超过1 min,如果超过则可判断状态为断开连接,这时服务端需要进行SocketShut-down,并将该实例从客户端实例链表中进行移除。
3 加快效率的改善策略
对玩家来说,花费漫长时间来读取地图实属是非常让人头疼的事情,如果我们能够在当前的地图中进行预读取,而后直接读取下来,将会大大缩短玩家等待的时间,为玩家带来一种更加舒适的游戏体验,所以这里提出了运用协同程序来实现地图预读取功能,进一步改善与加快下效率。
Unity引擎提供了IEnumerator接口,此接口最明显的特征就是:当运行完全部的start函数以后,在每一次运行类中Update函数前,它都会先运行IEnumerator函数,而我们此时将与CPU线程需求有关系的判断句式写入其中,那么就会出现每次更新帧获取Update函数前,都会对CPU线程需求状态进行访问的现象,如果在之前更新帧的计算结果内出现了CPU线程需求,则在下一次更新帧以前,不用过多操作就会自动进入到协同程序中,这个协同程序此时就会将信息发送到CPU那里,CPU根据收到的这条消息就会设立新线程,并以此需求为准展开运行。
这里设计的协同程度有以下两个特征,其一是协同程序接收器生命周期较长,这主要是因为它所读取的文件几乎都是地图数据,而高质量模型的地图场景数据量却很大,与这些比起来其成本可以说微乎其微;其二是由于协同程序里含有IEnumerator,所以是能够“挂起”的,由于读取数据的过程中它一直保持“挂起”状态,也就几乎不会造成太多的内存损耗,同时因为它一直被占用着,且析构的时候也会一并把IEnumerator进行析构,内存被泄露这种情况也就无需过多的担心了。
综上所述,本文在设计和开发Unity引擎下的多人在线网络游戏时,主要选择了客户端跟服务器端不同的系统规划方式以及改善效率的具体策略等方向展开了相应设计,并通过心跳检测跟预测拉扯相结合的形式充分保证了网络游戏的高实时性。
参考文献:
[1] 吕学琴,苏闰,陈彦军. 基于Unity引擎制作塔防游戏[J].
智能计算机与应用,2018,8(5):95-99.
[2] 龚高强. 基于unity引擎的3D游戏客户端系统设计与实现
梦幻西游密码修改[D]. 武汉:华中科技大学,2016.
[3] 黄薇. Unity引擎方式下3D对战型游戏的网络设计与开发
[J]. 现代电子技术,2015,38(23):118-121.
李 伟:论Unity引擎下多人在线网络游戏设计及开发