开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2234

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

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

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

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

[复制链接]  [移动端链接]
排名
6691
昨日变化
2

62

主题

291

帖子

1233

积分

Rank: 9Rank: 9Rank: 9

UID
32616
好友
11
蛮牛币
1370
威望
0
注册时间
2014-7-5
在线时间
190 小时
最后登录
2018-5-12

专栏作家

发表于 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 这个视频,因为我用过之后会有严重的卡帧,所以就不详细介绍了。



回复

使用道具 举报

4四处流浪
370/500
排名
12416
昨日变化
11

3

主题

133

帖子

370

积分

Rank: 4

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

回复

使用道具 举报

5熟悉之中
895/1000
排名
2638
昨日变化
8

4

主题

144

帖子

895

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

4四处流浪
492/500
排名
15592
昨日变化
5

0

主题

302

帖子

492

积分

Rank: 4

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

谢谢分享

回复

使用道具 举报

排名
1027
昨日变化
4

13

主题

1066

帖子

2859

积分

Rank: 9Rank: 9Rank: 9

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

回复

使用道具 举报

5熟悉之中
732/1000
排名
4147
昨日变化
25

0

主题

230

帖子

732

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1586/5000
排名
1087
昨日变化
2

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 | 显示全部楼层
感谢楼主分享!

回复

使用道具 举报

5熟悉之中
795/1000
排名
3245
昨日变化
3

3

主题

130

帖子

795

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1280/1500
排名
2658
昨日变化
4

0

主题

371

帖子

1280

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

4四处流浪
492/500
排名
15592
昨日变化
5

0

主题

302

帖子

492

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

7日久生情
2123/5000
排名
851
昨日变化

1

主题

470

帖子

2123

积分

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

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

回复 支持 反对

使用道具 举报

2初来乍到
128/150
排名
12209
昨日变化
11

0

主题

17

帖子

128

积分

Rank: 2Rank: 2

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

回复

使用道具 举报

7日久生情
1586/5000
排名
1087
昨日变化
2

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 | 显示全部楼层
谢谢分享

回复

使用道具 举报

5熟悉之中
868/1000
排名
2286
昨日变化
3

0

主题

97

帖子

868

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
2315/5000
排名
482
昨日变化
2

6

主题

126

帖子

2315

积分

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

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

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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