想必大家都玩过王者荣耀、DOTA、吃鸡等网络对战游戏,和单机类游戏相比,实时对战增加了玩家之间的互动,使得游戏不那么生硬单调,这也是越来越多玩家的喜好,所以开发实时对战游戏也成为了更多游戏厂商的趋势,对于我们独立开发者而言,这也是必不可少的技能。而博主我作为一名游戏热爱者&开发者,也是在联网对战开发的道路上磕磕碰碰,现与大家分享。
联网游戏无非在单机游戏基础上增加了一个服务端,让各个玩家的客户端都连接服务端,通过服务器的下发和接收数据来达到玩家数据同步的目的,思路是对的,然后你需要以下操作
1、申请一台云服务器(比如阿里云、AWS等)
2、选一个服务端架构(比如Photon、kbengine、Netty等)
3、开始写服务端逻辑(创建连接、创建房间、同步数据、断开连接等)
听起来不错,开始搞吧,一天、两天、半月...搞定一些了,然而自己的步伐已经赶不上行业发展的大部队了,说多了都是泪啊。虽然自己搭建游戏服务器是没有问题的,但是对于独立游戏开发团队或者小工作室而言,这无疑是会耗费很多时间和精力的,因此,我们有时候需要量力而行,选择最合理的方式快速完成我们想要的东西,捷径对于小团队来说还是有些必要的,这里我们所说的捷径就是利用一些成熟的第三方框架来满足我们的需求,而不是一味地造轮子。
实时对战的成熟解决方案在市面上是有一些的,比如photon、matchVS、nanolink等,具体可参考http://gad.qq.com/article/detail/33111,根据大家的分析,我选择了nanolink来作为我们的联网方案,具体接入方式可以参考官方文档https://www.tianti.com/nanolink/,这里我只分享一些在游戏开发中遇到的问题和解决方案。
1、多玩家实时对战
nanolink支持多人匹配和加入房间的,加入房间后每个客户端会分配一个client-index,同一个房间内的index是不同的,因此在人数较少的对战中,我们可以在场景中添加多个玩家,每个玩家根据index自行命名,如图;而当人数较多的对战中,我们可以通过实例化prefab的方式向场景添加玩家。
然后每个对象绑定MyPlayer脚本,用来接收和发送玩家实时数据,然后根据index判断玩家对应脚本
以上代码细心地朋友是否注意到这一行代码
transform.rotation = Quaternion.Euler (new Vector3 (targetRotation.x, targetRotation.z, targetRotation.y));
这是同步玩家rotation所用到的代码,然后我们在保存rotation的eulerAngles后,不是直接将此结果赋值,而是将rotation的y和z对换一下才可以,具体的原因我还在研究(如有知道的朋友可以留言)
rotation的问题找到了,y和z不需要对换,按照正常的赋值就可以了