【Unity】网络部分概览

解释一下网络中服务器和客户端的设置,希望能够帮到刚接触这一块的人。
对于服务器和客户端的概念就不再做解释了。

正文

首先要明确的概念是一个变量只能由服务器传给客户端或者相反,而不能同时操作。这也比较好理解因为Unity实现网络的时候仿佛没有时间戳的概念,这样子在两端变量名不一样的时候只能通过一方覆盖另一方面(或者说数据包一直是单向在发送)。
这里主要还是根据Unity的那个例程来解释。

首先场景中的主要物体有分为摄像机,怪物生成器,怪物和Player。

摄像机跟着每个客户端单独的主人公跑,所以说这是一个不需要服务器客户端之间信息传输(NetworkIdentity)的物体,但是它又确实受到用户联机操作的影响。对于这种物体只需要在明确哪个player是local player就行了。
剩下的三个都需要实现同步。
首先Player怎么理解呢,直观来讲就是我们能看到的这个跑来跑去由玩家操控的角色。在每一个客户端接入的时候都会生成一个这个prefab。
怪物生成器非常的常见,就是一段代码,基本上功能就是过一段时间生成一个怪物。

那么他们各自的特征决定了,像怪物会是一个需要客户端和服务器同步的物体,而我们并不想因为连接的客户端数量增多而生成几倍的怪物的话,怪物生成器就只需要在服务器上使用就行。而对于Player这个prefab,连贯性往往会直接影响用户的体验。

那么这样就大概的能够把这些物体区分开来了


PPT
角色的位置信息由客户端发给服务器,怪物由服务器发给客户端,生成器只在服务器存在。

到这里思路还蛮清楚的。
那么再引入一点就是,自定义变量往往是在服务器上修改再对各个客户端进行同步的([SyncVar])。
所以说我们在引入玩家的血量的时候,更好的一种方式是服务器修改客户端。
{PPT}
那么可以之前的那个位置和现在的血量是反的,为啥位置可以血量不可以呢……
一个解释是位置更加看重连贯性,而血量这种变量更看重同步。
另一个解释是,位置并不是自己设的需要手动同步的变量(NetworkTransform)Unity对动画啊位置啊这种的同步会提供内置的处理而对于生命这种变量需要自己coding。

那么现在可以看到怪物和玩家的血都是由服务器控制了,那再加入怪物对玩家的攻击。就非常的简单了。

但是比较复杂的是当,比如说血量掉到零之后,玩家需要在复活点复活(当然想让他死全了也行)。
所以这里引入血量对位置的一个改变。([ClientRpc])

那到现在位置用户还没有任何的攻击力啊,我们在这里引入子弹。
Player发出子弹([Command]),子弹接触到物体之后减少敌人的血。
{PPT}

我们的目的肯定是要用户尽可能察觉不到延迟,在传输方面尽可能减少网络的负担。
比如对于子弹来说,我们只要初始化之后位置可以由客户端独立计算而不需要再每隔一段时间去同步一下位置和朝向。
当然此外还有一些别的方法,比如说预计算啊,拟合啊,去减少用户的那种“卡成PPT”的视觉感。

此外就这幅图再来讲一讲可能遇到的问题。
1. 这种箭头(command和clientRpc)只能在Player预制件内部出现。
2. 这个箭头没有办法传递引用,只能传递一些数值。比如我尝试过在客户端计算子弹射中了哪个怪,再返回到服务器去减少那个怪物的血量。但是没有办法传递引用的话,就只能想办法传递这个怪的索引,代码量会比较不友好而且可能同步性会比较差。
3. 在设计结构的时候往往不止一种处理方法没比如说其实我也完全可以把按键信息传输给服务器,又服务器计算完再把物体的位置信息传递回客户端。
4. 这个感觉是Unity的问题,往往我们设置的一个物体会有多个子物体,但是只有root能够设置成信息传输的格式。也就是说,正常情况下的代码往往会把射击命令的脚本挂在子弹生成的物体下,但是现在以按键的接收只能在root上。

此外Unity提供了一个联网的Service。如果有需要可以考虑通过这个来实现联机功能。

参考

基本介绍
https://zhuanlan.zhihu.com/p/22582386

官方文档以及官方文档的翻译
https://unity3d.com/cn/learn/tutorials/s/multiplayer-networking?_ga=2.42834220.843910173.1526277890-422510572.1515301463
https://blog.csdn.net/swt369/article/details/78320900

https://www.youtube.com/watch?v=-m28axeuRNs&list=PLPV2KyIb3jR5PhGqsO7G4PsbEC_Al-kPZ&index=3
这个小哥哥声音真好听……窒息……

猜你喜欢

转载自blog.csdn.net/birdy_/article/details/80372394