游戏蛮牛学习群(纯技术交流,不闲聊):959392658
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2371

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2482|回复: 18

[郭老师讲堂] Network简单介绍与使用

[复制链接]  [移动端链接]
排名
6997
昨日变化
6

62

主题

296

帖子

1253

积分

Rank: 9Rank: 9Rank: 9

UID
32616
好友
11
蛮牛币
1361
威望
0
注册时间
2014-7-5
在线时间
199 小时
最后登录
2018-9-29

专栏作家

发表于 2018-3-6 16:00:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x

这两周开始了解Unity联网方面的知识,虽然之前在学校做过一些联网的测试,不过都是基于Socket实现,因为那时候也不知道有Network View之类的组件。个人觉得Unity的Network可以实现一些比较简单的网络传输,对于学习来说是绰绰有余。不过网上的教程都是前篇一律,大多数都是讲解那个胶囊体小人的官方例子,这边也链一个我学习UNet时看的文章:http://blog.csdn.net/er/article/details/51006463。但是跟着例子做一遍之后还是对UNet感到比较陌生,于是又自己做了一个小demo,配合着Unity Manual的说明,算是对UNet有了一个初步的了解,所以想把它记录下来, 帮助理解UNet。
这是运行截图,没错,这就是Unity自带的那个帅小伙,控制其中一个Client的人物移动,Sever和Client会会同步相应动作,是不是很简单的demo呢。其中左上为Sever,其他三个为Client,当然你也可以将Sever变成一个既是服务器又是客户端的Host。

在开始之前我们需要理解两幅图,相信大家已经见过了。


第一幅图想要表达的意思就是在C/S的网络结构中,服务器保存着所有玩家和敌人的Object,而客户端拥有的是服务器端场景的复制版,并且每个客户端都有一个由客户端操控的角色,叫做LocalPlayer。
在第一幅图的基础上理解第二幅图就可以归结为一个流程:

也就是说Client的所有操作都需要在Sever中处理,之后Sever再将处理结果同步到各个Client中。有了这样一个认识之后就可以开始啦。

一、工程
1.创建工程,我将该工程取名为TestUNet,并导入Characters包。

2.在场景中添加一个Plane,将Characters的prefab拖入场景中Reset位置,运行后可控制小人移动,确认可以移动之后删除场景中的小人。

3.找到小人的prefab,给他添加Network Identity组件和Network Transform组件,并设置Transform Sync Mode为Sync Transform。

这边说说这两个组件的意义,Network Identity组件相当于一个UNet的入口,每个需要使用UNet生成的物体都需要挂上这个组件,它会分配给物体一个NetID,类似InstanceID。Server Only选项决定这个物体是否只在服务器中生成,Local Player Authority选项就和第二个组件Network Transform有关,Network Transform组件是用来同步物体的Transform的,当该选项未勾选时同步的方向从服务器到客户端,而勾选时按字面意思理解,本地玩家就有了控制角色的权利,所以同步方向会从客户端到服务器。

4.创建一个空的物体并命名为NetworkManager,为该物体添加NetworkManager组件和NetworkManagerHUD组件,并将小人的prefab拖入Manager的Spawn Info中的PlayerPrefab中。

二、代码
小人上的脚本有两个,ThirdPersonUserControl和ThirdPersonCharacter
1.打开ThirdPersonUserControl,发现输入的判断在FixedUpdate()中执行,并调用了后者的Move()方法,传入的是输入的值。而客户端只能控制一个小人的移动,所以得判断该脚本所在的物体是否为LocalPlayer。添加或更改代码:

2.打开ThirdPersonCharacter,按照之前的思路应使用户输入的执行发生在服务端,所以也继承NetworkBehaviour,为Move()方法添加[Command]特性并改为CmdMove(),修改错误代码。

3.现在上传了用户输入,还需要从服务端同步到客户端执行结果,仔细查看代码发现动画的改变其实是由m_ForwardAmount、m_TurnAmount、m_Crouching、m_IsGrounded这四个值所控制了,很容易就想到了用[SyncVar]特性同步值。这里需要注意一点的是该特性具有单向性,即只能从服务端同步值到客户端,反之则否。所以为这四个值添加该特性。

4.但是实验证明这样做不能实现动画状态的改变,原因在于四个值虽然改变了,但却没有应用到控制器中。所以还需要做如下图所示的修改。

如果不需要考虑客户端避免碰撞,一个简单UNet的demo就做好啦。现在就可以Build一个exe文件,然后开两个程序进行测试啦。另外,关于动画同步的问题其实是可以使用NetwokrAnimator来进行同步,具体用法可以参考http://www.iqiyi.com/w_19rrx2jrax.html 这个视频,因为我用过之后会有严重的卡帧,所以就不详细介绍了。



回复

使用道具 举报

5熟悉之中
524/1000
排名
13132
昨日变化
3

3

主题

153

帖子

524

积分

Rank: 5Rank: 5

UID
216830
好友
2
蛮牛币
407
威望
0
注册时间
2017-4-9
在线时间
304 小时
最后登录
2018-12-11
发表于 2018-3-8 10:00:18 | 显示全部楼层
谢谢分享

回复

使用道具 举报

6蛮牛粉丝
1015/1500
排名
2408
昨日变化
1

4

主题

149

帖子

1015

积分

Rank: 6Rank: 6Rank: 6

UID
189765
好友
1
蛮牛币
3075
威望
0
注册时间
2016-12-5
在线时间
292 小时
最后登录
2018-11-21
发表于 2018-3-8 10:33:13 | 显示全部楼层
学习一下

回复

使用道具 举报

5熟悉之中
760/1000
排名
16511
昨日变化
5

0

主题

495

帖子

760

积分

Rank: 5Rank: 5

UID
199204
好友
0
蛮牛币
340
威望
0
注册时间
2017-1-5
在线时间
225 小时
最后登录
2018-12-11
发表于 2018-3-8 10:47:48 | 显示全部楼层

谢谢分享

回复

使用道具 举报

排名
746
昨日变化
6

17

主题

1152

帖子

3342

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
13
蛮牛币
12132
威望
0
注册时间
2015-1-14
在线时间
905 小时
最后登录
2018-12-11
发表于 2018-3-8 11:36:15 | 显示全部楼层
66666666666666

回复

使用道具 举报

6蛮牛粉丝
1185/1500
排名
2501
昨日变化
6

0

主题

306

帖子

1185

积分

Rank: 6Rank: 6Rank: 6

UID
228538
好友
9
蛮牛币
2589
威望
0
注册时间
2017-6-24
在线时间
325 小时
最后登录
2018-12-11
发表于 2018-3-8 16:03:41 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
1586/5000
排名
1223
昨日变化
1

0

主题

194

帖子

1586

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
148134
好友
0
蛮牛币
2586
威望
0
注册时间
2016-5-10
在线时间
456 小时
最后登录
2018-5-11
QQ
发表于 2018-3-9 08:53:57 | 显示全部楼层
感谢楼主分享!

回复

使用道具 举报

6蛮牛粉丝
1241/1500
排名
2229
昨日变化
6

5

主题

194

帖子

1241

积分

Rank: 6Rank: 6Rank: 6

UID
197464
好友
1
蛮牛币
947
威望
0
注册时间
2016-12-30
在线时间
436 小时
最后登录
2018-12-11
发表于 2018-3-9 10:59:54 | 显示全部楼层
不知道UNet是基于TCP还是UDP通讯,同步的延迟高吗?

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1348/1500
排名
2749
昨日变化

0

主题

390

帖子

1348

积分

Rank: 6Rank: 6Rank: 6

UID
126382
好友
0
蛮牛币
31
威望
0
注册时间
2015-10-22
在线时间
448 小时
最后登录
2018-11-13
发表于 2018-3-9 14:44:33 | 显示全部楼层
#在这里受教了 帖子很好 支持快速回复#

回复 支持 反对

使用道具 举报

5熟悉之中
760/1000
排名
16511
昨日变化
5

0

主题

495

帖子

760

积分

Rank: 5Rank: 5

UID
199204
好友
0
蛮牛币
340
威望
0
注册时间
2017-1-5
在线时间
225 小时
最后登录
2018-12-11
发表于 2018-3-13 16:18:22 | 显示全部楼层
在这里受教了 帖子很好 支持

回复 支持 反对

使用道具 举报

7日久生情
2375/5000
排名
764
昨日变化

1

主题

527

帖子

2375

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
26340
好友
1
蛮牛币
515
威望
0
注册时间
2014-5-23
在线时间
655 小时
最后登录
2018-11-22
发表于 2018-3-16 10:22:58 | 显示全部楼层
撒打发士大夫撒旦发射点发

回复 支持 反对

使用道具 举报

3偶尔光临
154/300
排名
11360
昨日变化
4

0

主题

19

帖子

154

积分

Rank: 3Rank: 3Rank: 3

UID
267400
好友
0
蛮牛币
91
威望
0
注册时间
2018-2-1
在线时间
51 小时
最后登录
2018-7-23
发表于 2018-3-17 11:44:40 | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
1586/5000
排名
1223
昨日变化
1

0

主题

194

帖子

1586

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
148134
好友
0
蛮牛币
2586
威望
0
注册时间
2016-5-10
在线时间
456 小时
最后登录
2018-5-11
QQ
发表于 2018-3-19 14:12:43 | 显示全部楼层
谢谢分享

回复

使用道具 举报

6蛮牛粉丝
1181/1500
排名
1604
昨日变化
8

0

主题

107

帖子

1181

积分

Rank: 6Rank: 6Rank: 6

UID
210517
好友
0
蛮牛币
3123
威望
0
注册时间
2017-3-7
在线时间
301 小时
最后登录
2018-12-12
发表于 2018-3-24 14:41:21 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
2458/5000
排名
489
昨日变化

6

主题

159

帖子

2458

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
84820
好友
17
蛮牛币
2443
威望
0
注册时间
2015-3-26
在线时间
819 小时
最后登录
2018-12-11
发表于 2018-3-27 14:11:24 | 显示全部楼层
问一个问题:比如我开启一个服务器端,连入一个客户端后进行一下指令操作,然后第二个客户端进入,这个时候先前操作的指令是没法同步给这个客户端的,请问Unet有解决办法吗?
或者有没有类似缓存的功能,客户端连入自动执行先前的操作?
[发帖际遇]: yanis 在网吧通宵,花了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表