手把手教你怎么做联网对战游戏

版块:技术交流 06月23日 17:21

做游戏的都知道,近几年来游戏市场简直就是在飞速发展,小至三消解谜大到竞技策略等各类游戏层出不穷,畅销榜付费榜等不同榜单也是一天一个样儿,乱哄哄你方唱罢我登场,看着别人的游戏赚的盆满笨满,再反观自己的游戏却受限于技术水平实现不了玩家更多的需求登不上大雅之堂,纵有一身才华也只能仰天长叹徒呼奈何!不过没关系,幸好你点进了这篇文章,我们用自己多年的游戏开发经验来手把手教你做游戏的联网对战功能!!莫问原因,同是天涯沦落人,四海之内皆兄弟,你的困难就是我的困难,想当年没有被技术门槛惨虐过的游戏开发就不是一个好开发~ 好了言归正传,接下来我们就教你怎么实现游戏的联网功能,在这之前,你需要准备一款需要联网的游戏Demo,然后就是见证奇迹的时刻了! 普通的手机游戏做联网对战就只要简单的几种模式,一种是"1 vs 1"的双人竞技模式,这种模式典型的就是《拳皇》这一类的游戏,一种是"n VS n"的多人同时在线游戏模式,这种模式就是《贪吃蛇大作战》此类的游戏,再多的还有就是两人合作过关的模式,诸如《魂斗罗》这样的游戏,其他的各种模式基本都是基于上述几种模式演化出来的,就不一一赘述了,那我们就从这几种主要的模式来介绍一个如何添加联网功能。

"1 VS 1" 手游

实现原理

"1 VS 1" 联网对战模式实现原理基本如下图所示:

① 网关:玩家进入游戏,网关按照IP或其他的逻辑对玩家进行判定,符合逻辑判定的玩家进入游戏,不符合的玩家被拒绝进入游戏;

② 分区:由于实时对战游戏对延迟高敏感, 为尽量降低网络延迟, 通常把地理位置接近的国家地区分配在一个分区,在服务器上可以为应用选择一组分区,客户端连接时, 通常由服务器根据客户端IP地址自动进行分区,分区之后按照不同的匹配机制进行联网匹配;

③ 连接:根据匹配结果,衡量物理距离等因素在子服务器列表中选择最优路线进行连接;

对战:玩家在最优子服务器中连接成功,实现联网对战功能。

基本定义

应用协议版本: 实时对战游戏的对战协议可能变更,并且各个版本可能兼容或不兼容,服务器可以设置每个应用的最小接入版本, 确保线上应用版本兼容。 通过config (“version”, “xxx”) 设定应用协议版本号, 0-255,缺省为 0

客户端ID: 可以是邮件地址, OpenID等形式, 或者是 16字符16进制字符串 通过config (“client-id”, “xxx”)设定客户端ID,通过getClientId ()可以获得客户端ID ,如果没有指定, 初始化时随机生成客户端ID

等级: 可以是邮件地址, OpenID等形式, 或者是 16字符16进制字符串 通过config (“client-id”, “xxx”)设定客户端ID,通过getClientId ()可以获得客户端ID ,如果没有指定, 初始化时随机生成客户端ID

房间: 房间名称为字符串;房间名称可以重复使用, 完成配对后注销;房间名称在connect2时指定

分区: 由于实时对战游戏对延迟高敏感, 为尽量降低网络延迟, 玩家将被分配到一个延迟相对较低的区服务器上 每个应用可以在后台选择启用/禁用某个分区

区服务器选择: 网关根据客户端IP 地址分区 + 客户端自动延迟测试

自动分区: 当玩家注册进入游戏时, 服务器首先根据客户端IP地址识别所在国家地区作为优先选择, 并根据服务器上该游戏配置的服务器列表对不同的服务器逐个进行测试延迟,将玩家分配在延迟最低的服务器上。 Ps,自动分区可能导致邀请者与被邀请的玩家不在同个分区

客户端指定分区: 通过config (“server-id”,serverId)可以指定玩家的分区服务器ID, 忽略服务器自动分区 玩家进入连接等待时, 可以通过getServerId ()获得玩家所在分区服务器ID Ps,客户端指定分区可以将邀请者和被邀请者配置在相同的分区上 例如: A邀请B进入房间R1时, 为确保A,B在同个分区 A可以进入连接等待, 并获得serverId发送给B,B 在连接前通过config (“server-id”, serverId)设定所在的分区, 跳过服务器自动分配分区

匹配机制

外网随机匹配(根据时间和等级进行随机匹配)

玩家在进入游戏后进行随机匹配,主要根据玩家的等级按照进入游戏的时间顺序进行匹配,游戏开发者可自行设置匹配时间限制和等级宽容度,等级宽容度最多可设置5个,匹配时每秒进行一个宽容度的匹配,该秒内匹配不到玩家则下秒在下个等级宽容度内进行匹配,超过最后一个宽容度还没有匹配成功, 一直用最后宽容度匹配, 直到完成或者超时失败。

比如在设置匹配时间为10s,等级宽容度为“±5、±10、±15、±20”的情况下,A玩家等级是3,B玩家等级是7,C玩家等级是12,玩家进入匹配的时间几乎一致。

则A玩家在匹配时优先匹配“3±5”的等级范围内的玩家,匹配到玩家B。

如果匹配时间段内没有满足“3±5”等级的玩家,则扩大范围至“3±10”等级内的玩家进行匹配,匹配到玩家C。

若玩家B、玩家C都不满足匹配条件则按照设置的等级宽容度依次进行顺延,在10s之内最大等级宽容度下仍然匹配不到在线的玩家,判定为匹配超时,需重新进行匹配。

外网好友邀请匹配(根据好友邀请进行匹配)

游戏玩家有时喜欢跟自己熟悉的朋友进行匹配对战,这种情况下可以根据外网好友邀请匹配机制进行准确匹配。

比如玩家A想要邀请玩家B和自己匹配进行游戏,则玩家A可创建一个房间,然后将创建的房间号发送给玩家B,玩家B启动游戏输入玩家A创建的房间号便可进入房间跟玩家A完成匹配进行游戏,同时此房间也可在下次匹配时使用。若玩家B在进入房间之前玩家A已离开所创建的房间或玩家B在超出规定时间(时间可由开发者定义)进入房间,则A所创建的房间失效关闭,服务器重新创建房间并注册玩家B,等待下一次匹配。

另外,在某些情况下还有可能希望实现以下功能:

玩家A 邀请玩家B, 玩家B 收到邀请后加入匹配时A已经离开匹配,这时立即匹配失败(而不是 B 去创建一个房间并等待),这种情况下房间名称前加上“+” 修饰符, 服务器收到房间匹配时, 发现第一个字符是 “+”, 如果房间不存在或者没有有效玩家正在等待, 立即匹配失败。

局域网随机匹配(根据局域网进行匹配)

若玩家想要在局域网条件下进行匹配对战,便可根据局域网匹配机制进行联机匹配。

比如玩家A想要在跟在相同局域网之内的玩家进行匹配,玩家B和玩家C正好也想在相同局域网内进行匹配,则玩家A发起匹配时服务器根据玩家B和玩家C进入匹配的时间顺序进行连接匹配。

以上便是"1 VS 1"联网对战下三种可供匹配的不同机制,玩家可根据自己需求进行匹配对战。

使用教程

为了节省时间,我们在Unity找一个官方的单机游戏Space Shooter,用天梯实时对战工具将它改造成双人对战模式,接下来看看我们是怎么在最快的速度做到联网的吧,由于篇幅过长时间有限就不一一赘述了,感兴趣的读者可以直接访问: 将Unity官方射击游戏(Space Shooter)改为实时对战小游戏,使用天梯实时对战服务(NanoLink)

PS, “多 VS 多”联网对战模式教程请关注下一篇文章

最后,如果对这个天梯对战服务SDK感兴趣或者有相关交流咨询的都的可以直接找我们

QQ:1334658591

Email:baixk@tianti.com


最新评论

欢迎交流

最好的 发布于 06月23日 17:24 赞 (0) 回复

厉害

陈少举 发布于 07月14日 10:04 赞 (0) 回复

你的回复