unity-开发进阶之网络通讯UNET

    unity在5.1版本之后更新了全新的多人在线网络工具,叫Unity Networking,简称UNET,此项技术开发者可以从传输层传输数据。通常,unity把开发者分为两种,一种是不是很懂网络知识的,只需要最小的代价完成多人联网功能,这类用户应该去使用NetworkManager或High Level API (HLAPI),第二类用户需要建设大型网络游戏,,需要强大且灵活的网络工具,这类用户需要去使用NetworkTransport API (LLAPI)

    授权服务器:承担着游戏世界的模拟运算,所有游戏规则,以及处理用户端的输入,将输入信息发送给服务器端,并持续接受服务端的传输过来的游戏状态。 这个过程可以简单的看作:

 客户端反馈玩家当前状态信息给服务端->服务端处理接受的状态信息->反馈各个客户端用于更新游戏世界的数据。

这种方法优势是避免了客户端的欺诈行为,这种情况下要求服务端的处理能力很强大,因为服务器要处理每个用户的输入。

    非授权服务器:并不控制客户端每个用户的输入和输出,客户端本身处理玩家的输入和本地客户端的游戏逻辑,然后发送确定的行为结果给服务端,服务端同步这些操作到游戏世界里。

    网络通信有两种重要的方式:远程函数调用与状态同步。

远程函数调用:

    简称RPC,它是用来调用远程计算机上某个函数的方法,包括:客户端调用服务端上某个函数;服务端调取所有客户端的某个函数或特定客户端的函数。

状态同步:

    被用于各个客户端中同步不断改变的数据。例如,客户端玩家跑步、跳跃或者释放技能,其他客户端能够确切知道该玩家的位置,在干嘛。因此,状态同步需要大量的带宽消耗,所以开发者应尽力去优化。

HLAPI:

    这种网络系统需要一个服务器端,如果有专用服务器,那就很好,如果没有,某一个客户端可以作为服务器的角色,此客户端也被称为host(主机),host的客户端和服务器端在统一进程里,使用的是叫做LocalClient的特殊客户端,其他客户端叫做Remote Client。由于host客户端和服务端在同一进程里,且共用同一场景,所以Local Client与服务端通过直接函数调用和消息队列进行通讯,当然这样几乎没有延迟,其他客户端就需要通过普通的网络连接和服务端进行通信了。

    网络系统中,玩家对象都是专有的,一个人不能去调用另一个人的玩家对象,不然就乱套了。因此有了Myplayer。

Transport layer API:

    基本服务包括:

    建立连接

    使用多种服务水平的通信

    流量控制

    统计数据

    通过中继器或本地发现的额外服务器进行通信

使用两种协议:通用通信UDP和用于webGL的webScokets。通常大型游戏都是用UDP来传输数据,速度快,允许丢包。

工作流程为

    初始化网络传输层。

    配置网络拓扑。

    创建服务器端主机。

    开始通信(处理连接和发送/接收消息)

Internet Services



版权声明:本文为Scopperil原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。