客户端能够以和帧频一样的速度向服务端发送移动消息.doc_第1页
客户端能够以和帧频一样的速度向服务端发送移动消息.doc_第2页
客户端能够以和帧频一样的速度向服务端发送移动消息.doc_第3页
客户端能够以和帧频一样的速度向服务端发送移动消息.doc_第4页
客户端能够以和帧频一样的速度向服务端发送移动消息.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

客户端能够以和帧频一样的速度向服务端发送移动消息。成千上万的并发玩家期待着可以在同一个虚拟世界中流畅地移动,并且与其他玩家、生物或是物品以一种可信的方式进行交互。个人电脑和游戏机上的单机游戏或是小型多人游戏不断地在夸张的玩家移动、真实的物理以及对地形进行逼真的改变(通常通过破坏地形和建筑物来实现)等方面追求极限,这些都可以让玩家体验到很高的自由度,从而使他们对MMP游戏具有更高的期望。MMP游戏开发者实在无法抗拒日益逼真的游戏环境和交互所带来的诱惑。每个新发布的MMP游戏通常都会在至少一个具有重要意义的方面挑战极限从而与竞争者有所区别。然而,真正地在发布时成功做到这点的MMP游戏很少,这就说明了追求极限所带来的压力可能会导致游戏的最终失败。本文的目的是要介绍与MMP游戏中的移动和物理系统相关的各种问题。理解这些问题才能更好地为发布引人入胜的游戏做好准备,并且可以避免由于以一个幼稚的,过于冒进的方式来为这些系统进行建模所引起的无法预料的后果。3.6.1我们可以发布这个游戏了吗?这个问题的关键在于,开发人员总是面临着发布游戏所带来的压力,他们必须以一种及时而经济的方式来实现这点。毫无疑问,这必然导致他们在实现用于支持游戏的底层系统时必须作出很多折衷。开发人员必须对这些系统能够做什么加以限制。否则,这个游戏永远都不会完成。另一方面,在游戏模式中加入过多的限制会降低游戏的真实性。如果一个玩家觉得自己和游戏的关系非常松散,他就很可能会取消订阅。开发人员当然希望能够避免这种情况的发生。同样,开发团队不能就所作的折衷达成一致时也会非常危险。设计人员可能会觉得这些限制使游戏世界变得死气沉沉,并且无法让玩家在交互中获得一种融入其中的真实感受。游戏世界构建人员也许能理解这些限制,但是他们可能会不停地寻找那些可以突破限制的方法来创建一个更具交互性或是在视觉上更为有趣的游戏环境。虽然这些想法都是正确的,但是它们会影响到整个团队最后发布产品的能力。必须以一个平衡的方式来看待这个问题:在移动和物理模块中实现足够的真实性从而让玩家能够持续地参与游戏,并且加以足够的限制使得这个游戏可以以一种及时而经济的方式被实现。让所有团队成员对此达成共识非常重要。这不仅会减轻总体压力,还会减少返工或是长期维护带来的麻烦,程序员的创造力也可能会因此而增加。3.6.2这是一场战争本质上,在MMP游戏中进行移动和物理方面的开发会受到一类特定玩家的影响,本文把他们称为恶意(rogue)玩家。这类玩家乐于使用任何必要的方式以在游戏世界中获得优势。他们会试图以比游戏规则所允许的方式更快地进行移动,或是去那些他们不应该到的地方,甚至去发掘那些不曾预料到的物体-环境交互。游戏管理人员必须解决这些恶意玩家,否则就不得不去面对游戏中可能出现的无政府状态。游戏做得越成功就越有可能成为恶意的玩家的目标。这些人的数量远大于游戏开发员工数量,他们通常具有与开发游戏技术人员相同的才能,有时可能会更高。更可怕的是,恶意玩家们有时能够花费大量的时间来试图攻击游戏。一旦某个恶意玩家攻击成功,所有诚实的玩家都会受到伤害。这种行为反过来会诱使那些原本诚实的玩家也采用某些攻击手段来重新获得公平的地位。当支持人员发现有人欺骗,就会封锁这个玩家的账户,从而导致游戏失去一个付费用户。最终,这会成为一个恶性循环。如果开发人员在实现游戏时对所做的决定进行仔细考虑,就可以显著地减少这类问题。因此,在对移动和物理的设计和实现的各个方面进行评估时,都必须考虑到恶意玩家的存在。游戏开发人员必须考虑那些有时间和能力去反汇编并且修改客户端的代码、游戏资源、网络数据包的人会怎样使用这些信息在游戏中进行欺骗。相对于玩家都是诚实的情况来说,这毫无疑问会让本身就极具挑战性的工作变得更为困难。根据市场上已经发行的游戏的经验,如果开发人员认为他们的游戏不会受到这样的攻击或是只会吸引那些诚实玩家的话,那是非常愚蠢的。必须准备好建立一条防线,这就顺理成章地引入下一个话题:防御恶意玩家的第一条防线,也是最主要的防线。3.6.3服务端永远是对的在移动和物理中必须考虑的第一个问题是客户端自治。在目前的MMP游戏环境中,每个玩家的计算机都具有大量的CPU资源和硬件加速能力,在游戏中尽可能地使用这些运算能力是非常有用的。然而,当服务端需要确定玩家应该移动到什么位置以及他们应该怎样和环境交互时,就必须建立一条防线。游戏系统应该通过客户端代码来让玩家感觉到他们在进行控制,而对这些事物的最终裁决则应该由服务端来进行。为了让玩家可以在游戏世界中流畅地移动,游戏客户端必须立即响应玩家的移动请求并且根据客户端的地形和物体表示对这些请求做出判断。如果玩家要向前移动,并且客户端代码确认没有障碍物阻止玩家进行移动(譬如说不能穿越的地形或是会发生碰撞的物体),他才可以移动。每一帧都会进行常规的判断,一旦玩家与某个障碍物发生碰撞,他会立即停止。如果某个玩家故意地修改客户端游戏代码或是游戏世界中的几何信息以访问游戏世界中他不应该进入的区域,服务端就必须检测到这些违例行为并且立即在服务端对游戏世界的表示中进行修正,然后把这些修正广播给每一个需要知道这些信息的客户端。譬如说,在服务端和客户端都有对游戏世界的详细表示,其中有一个由很多玩家的房屋组成的村庄。当一个玩家在村庄中转悠时,如果没有某间房屋的钥匙,他就不能进入这个房屋,而只有房屋的主人才可以给他钥匙。如果服务端代码假设玩家进入房屋的惟一方法是使用钥匙,那么就很容易受到攻击。一些恶意玩家会通过修改客户端代码来绕过这样的判断从而把他们的角色放在房屋内部,这样就可以模拟一次合法进入的结束情况。服务端必须判断一个成功地把他的角色放在另一个玩家房屋中的恶意玩家会不会顺手牵羊拿走房屋内的某件物品。一旦服务端检测到一次非法进入,它至少必须把那个玩家的位置修改为一个在房屋以外的已知合法位置。这个位置可以是这个玩家在房屋以外时最后的合法位置,也可以是一个已知的位置,譬如说房屋的门阶。无论采用哪种方式,一旦服务器发现了这一情况,那么当玩家试图请求获取房屋中的某件物品时,这个请求应该被拒绝,因为玩家实际上是在房屋外面。不仅如此,周围的其他玩家都应该看到这个玩家在房屋外面。说实话,游戏的服务端并不关心在那个恶意玩家的(被修改过的)客户端上这一切看起来会是什么样的。以下安全措施也可以用来预防这类可能的侵入。先确认某个玩家的进入是否合法,然后才把房屋的内容发送给这个客户端。要求把房屋中的物品都保存在一个固定的保险箱里,并有一把单独的钥匙。把进入房屋的行为实现为把玩家传输到另一个区域中,这样玩家就不能仅仅通过移动来进入房屋。总之,服务端永远是对的。服务端必须具有内建的修正机制来防范那些任性的玩家。此外,服务端的仿真必须具有确定性,它必须对每一个玩家行动的处理都应该产生一个清楚明白的状态。譬如说,一旦服务端得知某个玩家掉下一个致命的悬崖,它会立即把这个玩家移动到这个悬崖的底部并且认为他已经死亡。而客户端会根据服务端确定的最终状态提供相应的视觉表示。3.6.4移动的代价70%的MMP游戏带宽与移动有关。因为带宽是MMP游戏中一项重要的持续成本,努力地减少这方面的需求可以节约大量的金钱。不仅如此,如果可以提高一个游戏的数据传输效率,就可以让更多的硬件有能力运行这个游戏,从而拓宽潜在的用户群。在最快情况下,客户端能够以和帧频一样的速度向服务端发送移动消息,这个消息描述了玩家的新位置。保守估计的话,这意味着每秒钟有15个移动数据包,因为15帧/秒已经接近一个游戏能够做出正常反应的极限了。假设每个移动数据包的大小是20个字节,每个玩家每秒会产生300字节的移动数据。如果游戏中每个客户端可以同时看到20个玩家,简单的移动所导致的数据传输率就会提高到6kbytes/s。这已经超过了一个56k调制解调器的理论极限,而我们所实现的功能只不过是让玩家像雕像一样四处移动。很明显,开发人员必须要寻求一个更好的方法。这个方法可以从降低移动数据包的发送频率开始。15次每秒的更新频率对于服务端验证这个玩家的移动是否合法来说的确是高了点。客户端仍然可以产生这些数据包,但是它可以使用一个名为暂时频道(ephemeral channel)的方法,只有那些在一个更新周期中最新的移动数据包才会被真正地发送给服务器。这对于瞬时信息(譬如说移动数据)来说非常有用。玩家位置最精确的表示就是这个客户端最新生成的数据包。每当服务端收到移动数据包时,它会根据来自这个客户端的前一个移动数据包做出判断。随后服务端确认从前一个移动数据包的位置到当前移动数据包的位置之间的移动。为了节约CPU时间,服务端可能只对这两个位置之间的几个特定点进行采样。如果这些采样点以及最终位置都是合法的,那服务端就会确认这个玩家进行了一次有效的移动。一旦检测到一个无效的位置,服务端会向这个客户端发送一个修正数据包。同时也会把这个修正数据包作为这个玩家的实际移动情况发送给附近的客户。使用这样的技术最重要的就是要确保在两个位置之间的采样点距离应该小于游戏中最小的碰撞/触发体(collision/trigger volume)。譬如说,如果两个采样位置之间最大不超过1.2米,那么所有的墙壁、陷阱、瞬间移动门户等玩家可能会被阻挡或是触发的物体的尺寸都必须超过1.2米,这样才可以确保玩家不会穿过它。图3-12中的玩家在不经意间就穿过了一个一米宽的障碍物,因为两次移动更新之间的采样点以及这两次更新的位置本身都是合法的。图3-12玩家穿过了一个小于采样距离的障碍物此外,还应该为一个玩家角色在两次移动更新之间可以移动的距离设置一个上限。考虑到因特网的不一致性和延迟性,游戏的设计允许在移动的外观上有一些变化,这也可以减少修正带来的影响。然而,设置一个上限可以确保玩家不能滥用这一特性来获益。譬如说,如果玩家角色的最大移动速度(后面将会对此进行更详细的讨论)是6米/秒,而工作人员每秒对服务器更新4次,这样设计人员可能会把两个数据包之间的移动上限设为2米。任何超过这个范围的移动都会被修正后发回给客户端。这不但确保考虑了足够的与因特网相关的变化,也可以确保恶意玩家无法使用手工制作的数据包在游戏世界中四处乱窜。并且,为了使其更为有效,必须采用某种欺骗检测机制来记录玩家移动超过最大角色移动速度的历史。这有助于查明哪些玩家的非法移动在统计上是不可接受的,从而使游戏管理人员可以对他们进行更细致的监视(参见侵入监测)。3.6.5移动速度如果一个游戏设计允许玩家使用不同的移动速度(譬如说跑步和行走),并且能使用魔法或其他方式来提高移动的速度,游戏世界就会变得更为有趣。游戏设计还可以让玩家角色能够通过加速来加快步伐或者减速来放慢脚步甚至停下来,从而使玩家对游戏更加着迷。无论如何,一个游戏设计也不能让客户端自主地决定一个玩家角色的移动速度。各种在线游戏中都曾有玩家成功地改变了他们的移动速度,他们会使用修改过的程序来加速客户端游戏中的动画播放速率或是帧频。玩家们总是想要减少令他们觉得无聊的时间,并希望能够以允许的最快速度进行移动。在大型游戏世界中更是如此,因为在不同位置间进行移动需要花费大量的时间。此外,设计人员应该知道在游戏中允许提高移动速度会导致系统在对玩家角色移动进行验证时为错误留下更大的余地。譬如说,在天堂(Lineage,LIN)中,玩家可以通过各种很容易获得的药水来加快移动速度。不仅如此,角色还可以变形为另一种生物来加快移动速度。这些选项的组合再加上网络延迟所带来的影响会导致移动速度具有很大的变化。在这种情况下,玩家常常会试图修改客户端来获取速度上的优势,由于允许的变化范围很大,系统很难检测出这种尝试。这里有一种保守的方法,那就是在游戏世界中只允许以两种速度移动:快速移动和慢速移动。当玩家想要在某些环境中对他们的移动距离进行精确控制,或是想要准确地指出他们的目的地而不想超过时,他们会使用较慢的移动速度。在其他情况下,他们会使用较快的移动速度,这个速度必须足够快以使玩家在游戏世界中快速移动时能够感觉到明显的进展。这样就可以把玩家的移动速度变化保持在某个预定的基本值附近。验证一个玩家角色是否以允许的速度进行移动的代码将会更容易实现,因而不容易受到侵入的影响。游戏中的非玩家角色(NPC)也可以使用变化的移动速度,因为对他们的控制完全是由服务端进行的。首选方法是把NPC的移动速度调节到和玩家角色的标准移动速度一致,而不是让玩家能够自主地改变他的标准移动速度。另一种方法是把游戏世界的尺寸按比例缩小。设计人员没有理由把游戏中的地形和空间做得很大并且要求玩家花费相当长的时间作来回移动。游戏的设计应该把玩家在有趣事件之间的无聊时间降到最低限度。很多现存的MMP游戏都会给人一种空荡荡的感觉,开发人员通常会实现特定的机制来使玩家在游戏世界中的移动不会过于沉闷。而按比例缩小游戏世界的尺寸并且增加有趣场所的相对密度可以让这种感觉大大降低,开发人员也不必再为此开发特定的机制,这可以节约不少开发时间。3.6.6玩家可以从这里到那里吗?如果假定玩家具有完全的自由,那么要对玩家在游戏世界中的移动加以限制会变得非常困难,除非在游戏中强加一些限制来阻止移动。1.游戏世界中的移动这个方法需要游戏世界构筑人员坚持一系列的规则,譬如说如果不希望玩家到达那里,就让这个斜坡大于60。或是在游戏世界中放置障碍物来隔开某个区域。随着测试人员和玩家发现各种方法来进入那些禁止入内的区域,他们必须持续作战来填补现存的漏洞,然而他们并不能立即确定这个问题是否真的被修复了。如果在开始设计游戏世界时先假定玩家哪里都不能去,问题就会变得相对简单。随后游戏世界构筑人员就可以通过开辟一条玩家角色可以行走的道路来指定那些可以合法移动到的位置。这么做可以使检验非常容易,因为当玩家不能到达某个位置时情况会很明显:他们在去那里的路上停下来了。2.瞬间移动瞬间移动是一种非常方便的游戏机制,几乎每个MMP游戏都会使用它。对于玩家角色来说,这是一个逃避危险或迅速移动到另一个位置的好方法。还有一种类似于瞬间移动的机制可以帮助那些被卡住一定时间的NPC摆脱困境。这有助于处理那些游戏世界中的故障点。譬如说,玩家可以把游戏中的怪物引诱到某个地方以使它们无法动弹,这样他就可以随意攻击而不必担心会受到伤害。然而,每当一个角色开始瞬间移动,游戏开发人员就面临一个问题:怎样确定这次瞬间移动的有效目的地。如果游戏实现了角色之间的碰撞(也就是说,角色不能在同一位置重叠),这个问题就会变得更难解决。要实现一个能够在具有可移动和不可移动物体的任意三维世界中可靠地发现一个有效位置的算法不仅很有挑战性,而且还很容易出错。即使游戏设计把瞬间移动限制在一些预定的位置,譬如说两个瞬间移动装置之间,仍然必须确定角色到达时应该放在什么位置。游戏设计人员可以通过为每个瞬间传输装备标记到达点来简化这个问题,每个到达点只能被来自某个方向的瞬间传输角色访问。这个方法意味着需要面对的问题只剩下一个了:当一个玩家试图瞬间移动时,所有有效的到达位置可能都已经被占用了。然而,从游戏特性的角度来看,以这种方法来实现瞬间移动会受到很多限制,并且不能解决玩家角色在登入游戏后怎样在游戏世界中出现的问题。如果游戏世界中的玩家之间没有碰撞,网络就可以更为稳健地实现瞬间传输。可能发生的最坏情况就是角色最终会和另一个角色重叠。通常玩家会很快地进行调整并且移走。3.平移动画(translating animation)瞬间传输问题的一个变形是有些玩家行动可以让角色的最终位置和他的起始位置不同。这些移动通常不是任意的:这时电脑播放器会播放一个特定的动画并且把角色在3个轴(也就是x,y,z)中的一个或多个上进行平移。这些移动可能包括跳跃、翻筋斗或是一些夸张的武术动作。服务端进程通常会认为这些是特殊的移动类型而把它们和通常的移动区分开。通过从动画中提取移动信息,服务端能够处理这些移动请求并且以服务端对游戏世界的表示为背景对这个平移进行正确的处理。随后服务端就能够确定移动的新位置,并判断这个平移是否会被障碍物打断,譬如说墙或者门。游戏开发人员可以根据游戏的需要决定是否要等待服务器确定后才播放动画,从而提供更精确的表示。当然,有时给予玩家及时的响应也许更为重要,这样做的代价是有可能要进行很大的修正。这里还有一种方法,那就是让客户端判断这个动作是否能够成功完成,如果不能,就让玩家的动作请求失败,相对来说,前两个方法看上去更为合适。譬如说,如果有一个夸张的武术动作可以让一个角色的位置向前移动5米,系统可能会选择在获得服务器的确认后才开始显示相应的动画,并且最终玩家会撞到3米外的门上而被迫停止。系统也可以选择立即显示这个动画,这样玩家角色就有可能会在服务器告知他正确的终止位置前略微移动到门里面。对于玩家来说,这两个选择都比因为这个角色无法按照动画定义的那样向前移动5米而不能进行这次移动要好。3.6.7碰撞检测通常,确定一个游戏中的物体是否挡住其他物体的移动路径的过程被称为碰撞检测。碰撞检测并不是在MMP游戏中才有的问题,它在MMP游戏中的重要性也并不比在其他游戏中的重要性低。这里介绍的大部分方法原先都是在单机游戏或是小型多人游戏中实现的。碰撞检测的计算开销非常大,这是因为所需进行的测试数量会随着所需测试的对象数量的增长呈几何级增长。碰撞测试的基本方针是尽量把在任何时刻必须进行碰撞检测的物体数量最小化。如果游戏设计让开发人员可以使用一个根本不需要任何碰撞的游戏世界而不会影响玩家对游戏的投入,那么他们应该为此高兴并且利用这一优势。然而,通常并不是这样,因此本文将对这个问题进行更加细致的研究。1.碰撞体(Collision Volumes)在实现碰撞检测时,游戏的设计通常使用简单的几何体(Geometric Volume)来表示游戏世界中的各种物体和角色。对简单几何体(譬如说球体、长方体、胶囊体(Capsule,圆柱体的两端各接一个半球)和圆柱体)之间的交叉进行计算要比确定两个复杂物体之间的交叉简单得多。由于典型的MMP游戏在运行时需要大量的碰撞检测,为了性能而进行这样的简化是很有意义的。毫无疑问,简单几何体很可能只是游戏中所出现物体的粗略近似。然而,这个问题是否真的像乍看上去那么大?拿一棵树做例子。树在游戏中的作用是什么?当然是用来构造游戏世界并使其看上去更加生动。不仅如此,它可能还会被用作障碍物来限制角色的移动,正如在真实世界中的树一样。如果树和角色所使用的碰撞模型和它们在真实世界中的外观非常接近,玩家在移动时将会遇到不少麻烦。当玩家在森林里四处走动时,他经常会被树枝和树根的突出部分挡住,甚至连叶子都会在玩家经过时缠住他的肩膀。虽然这要比只使用简单的几何体来进行碰撞的游戏世界更加真实,但它事实上会使这个游戏更为无趣。使用和树干一致的圆柱体来表示一棵树是一个更好的方法,它可以让玩家移动起来更为方便。或许玩家的脑袋偶尔会和树叶或树枝交叉,但是相比在移动时被意外的中断来说,玩家不太会注意这些视觉上的问题。在游戏世界允许的情况下,开发人员可以使用另一种常见的技术来提高碰撞的效率和精确度。游戏开发人员可以用一个简单的几何形状来构建碰撞体并把它用于粗略的判断。一旦这个粗略的判断确定这两个物体发生了碰撞,开发人员就会使用更加细致的几何体来进行精确的判断。譬如说,如果有两艘宇宙飞船在太空中飞行,游戏的设计可以简单地使用外接球体来表示它们。一旦这两个球体相交了,这两艘飞船就可能发生碰撞,这样就可以继续对那些表示飞船各个部分的更小的几何体进行判断。这样不仅可以确定碰撞是否真的发生了,还可以精确地知道碰撞发生在什么地方,从而利用这一功能来指出损坏的位置。2.角色碰撞体那应该怎样在碰撞中表示一个玩家角色呢?显然可以从引擎所支持的基本几何体(譬如说球体、圆柱体等)中选择一种。游戏的设计不应该试图把整个角色都用所选择的形体来包住。正如前面在树的碰撞中所提到的,这样做同样会导致类似的问题。通常的游戏可以使用一个和角色的躯干类似的圆柱体,最低不要低于膝盖的上方,最高不要超过角色的肩膀,使用这种做法,角色不太会被那些简单的物体(譬如说楼梯)挡住,但是他们会被那些从逻辑上会阻止他们的物体挡住。图3-13中是本文建议为角色使用的碰撞体,下图把它和游戏世界中可能出现的其他物品的碰撞体作了对比。图3-13角色的碰撞体与其他物品的碰撞体之间的对比碰撞系统不仅要能够满足游戏的要求并正常工作,还应该保持游戏的趣味性。为了让玩家能够持续地投入到游戏中,游戏的设计通常宁可引入一些视觉问题。在为游戏世界创建障碍物时,必须确保其碰撞体的长度和高度比角色在游戏中能够移动的最大合法距离要长,并且碰撞体的高度要高于角色碰撞体的最低点。3.角色与角色之间的碰撞对于角色是否应该被设计人员在游戏世界中故意放置的静止障碍物阻挡住这一问题,实际上不会有什么争议。而对于角色是否应该被其他角色(无论是玩家角色还是NPC(譬如说由AI控制的怪物)阻挡来说,则没有一个确定的答案。下面列出了一些实现角色之间碰撞的优点:可以使游戏世界变得更为真实,龙之谷辅助;玩家拥有他们占据的空间并确立了自己的地盘;如果在服务端和客户端都实现了避免碰撞的代码,就不会因为玩家在游戏世界中占据同一块空间而导致视觉问题;它的实现很简单;因为可以使用同样的方式来处理所有的碰撞表示;它使游戏的开发可以实现更有趣的机制,譬如阻挡将会成为战略中一个不可分割的部分(譬如天堂中的围城战(castle siege)。下面这些则是不实现角色之间碰撞的优点:可以减少与碰撞有关的CPU负荷;因为根本不需要进行任何角色之间的碰撞计算;向任意位置进行瞬间移动将会更容易实现,因为在这种情况下,只要目标位置对于角色来说是一个有效位置就可以了;玩家不能使用碰撞来骚扰其他玩家(譬如说阻挡在某个商店的门口);不必为了处理那些同时到达同一位置的角色而编写相当复杂的代码(譬如说,当确定某个玩家最终可以占据这个位置时,必须采用一些方式来进行修正,这往往还会影响玩家对游戏的专注程度);即使在玩家角色们聚集成很大的群体时,与碰撞有关的CPU负荷也不会一下子大量增长;不再需要为那些由AI控制的NPC编写复杂的代码来避免碰撞。现在不少游戏在实现角色碰撞时采用了一种推挤(shove)模型。如果一个玩家角色的去路被另一个玩家角色挡住,他可以把那个玩家角色推开。然而,那个被推开的玩家角色肯定会感到不高兴,因此有必要事先在游戏背景中对这个模式的合理性加以评估。4.缩放最后,游戏的设计对角色碰撞体进行处理时还有一个问题需要考虑。如果游戏要求支持改变角色几何建模的大小来为角色增加多样性和独特性,那么设计人员必须决定这一变化应该对角色的碰撞表示产生什么样的影响。如果仍然使用同样的碰撞表示,现存的碰撞代码就很可能可以正确工作于具有不同尺寸变化的角色上。另一方面,设计人员也可能因此丧失了针对不同的尺寸变化实施独特的游戏机制的机会。3.6.8物品放置为了让玩家能够更加投入地参与MMP游戏,通常游戏设计会允许他们在游戏世界中放置各种物品,这样他们就能够在游戏世界中留下自己的标志。譬如说,有些游戏中玩家可以在游戏世界中获得自己的房屋,如果他们能够使用各种物品来装饰房屋的话,那会是非常诱人的。然而,允许玩家在游戏世界中任意放置物品通常会导致大量的问题。不仅服务端会因为需要对大量的物品进行记录而增加很多开销,还会为那些恶意玩家带来很多机会。考虑下面这些可能。如果一个游戏支持玩家之间的对战,玩家就可以在某个很小的区域内放置大量的物品;一旦其他玩家进入这个区域就会暂时失去控制,因为描写这些物品的数据包会占据大量的带宽。可以通过富有创造性的方式把物品堆叠起来以形成一些通路,这样就可以进入那些通常无法进入的区域。玩家可以把某个物品放置在游戏世界中并且站到这个物品上面;随后他可以把这个物品抽出来并且把它放到游戏世界中的另一个地方,这可能会让玩家能够移动到一个通常不能进入的区域。同意交易的玩家会通过把物品放在地上来进行交易,但是不诚实的玩家可以在交易完成前把这个物品拿走并且不归还这个物品。这样的场景举不胜举。游戏的设计应该尽可能地避免让玩家可以在游戏世界中的公共区域内任意地放置物品。下面是一些可行的方案。在一定时间内,把放置的物品标记为属于它原先的主人。这段时间过后,其他玩家也可以拿走它。实现一个非常积极的衰变机制:如果某个物品在一段时间内没有人认领,它就会被自动销毁。把放置的物品抽象为某种通用的容器,看上去就好像一个袋子一样;并且它不能被堆叠,也不能放置在其他容器中。在游戏世界中指定一些预先定义的、可以接受的位置来让玩家放置物品。譬如说,可以在游戏世界中设置一个公共的基座(pedestal),掌管它的玩家团体可以在上面放置一个物品来进行装饰。不允许在公共区域放置任何物品;与此相反,只允许把物品放置在安全的区域,譬如说玩家的房屋中。实现一些会四处走动并且会把放置在地上的物品捡起来的NPC。物品只能在预先定义的放置点上进行有限的堆叠,譬如说可以把画挂在墙上,可以把银器放在桌子上。在每次向客户端发送更新数据时,为与物品相关的信息设置一个上限,赋予那些会影响游戏的对象更高的优先级,譬如说有威胁的怪物。3.6.9侵入检测(Hack Detection)几乎可以肯定,虽然游戏管理人员竭尽全力地预防,那些在客户端和服务端之间传输的数据包的详细内容最终还是会被*的。这并不是说不应该对这些内容进行加密或者以其他方式来使其更难理解Randall02。而是应该把它当作一道能够延缓*的额外防线,这样它就可以帮我们赢得很长的时间。游戏开发人员可以用这段时间来对游戏系统进行持续的加固以检测和防止那些恶意玩家的侵入。毫无疑问,开发人员必须对每一个游戏系统的设计和实现进行评估来看看那些恶意玩家会怎样侵入这些系统。在对不同的设计进行评估时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论