开发者专栏

关注:2180

当前位置:足球投注 技术专区 开发者专栏

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

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

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

[复制链接]  [移动端链接]
排名
6593
昨日变化
3

足球投注 www.zjrxh.com 62

主题

290

帖子

1229

积分

Rank: 9Rank: 9Rank: 9

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

专栏作家

跳转到指定楼层
楼主
发表于 2018-3-6 16:00:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x

这两周开始了解Unity联网方面的知识,虽然之前在学校做过一些联网的测试,不过都是基于Socket实现,因为那时候也不知道有Network View之类的组件。个人觉得Unity的Network可以实现一些比较简单的网络传输,对于学习来说是绰绰有余。不过网上的教程都是前篇一律,大多数都是讲解那个胶囊体小人的官方例子,这边也链一个我学习UNet时看的文章://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来进行同步,具体用法可以参考//www.iqiyi.com/w_19rrx2jrax.html 这个视频,因为我用过之后会有严重的卡帧,所以就不详细介绍了。



4四处流浪
367/500
排名
12136
昨日变化
4

3

主题

132

帖子

367

积分

Rank: 4

UID
216830
好友
2
蛮牛币
236
威望
0
注册时间
2017-4-9
在线时间
169 小时
最后登录
2018-4-25
沙发
发表于 2018-3-8 10:00:18 | 只看该作者
谢谢分享

5熟悉之中
822/1000
排名
2858
昨日变化
14

4

主题

142

帖子

822

积分

Rank: 5Rank: 5

UID
189765
好友
1
蛮牛币
2507
威望
0
注册时间
2016-12-5
在线时间
236 小时
最后登录
2018-4-28
板凳
发表于 2018-3-8 10:33:13 | 只看该作者
学习一下

4四处流浪
389/500
排名
16050
昨日变化
16

0

主题

247

帖子

389

积分

Rank: 4

UID
199204
好友
0
蛮牛币
106
威望
0
注册时间
2017-1-5
在线时间
106 小时
最后登录
2018-4-28
地板
发表于 2018-3-8 10:47:48 | 只看该作者

谢谢分享

排名
1119
昨日变化
1

13

主题

981

帖子

2637

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
7
蛮牛币
9372
威望
0
注册时间
2015-1-14
在线时间
703 小时
最后登录
2018-4-28
5#
发表于 2018-3-8 11:36:15 | 只看该作者
66666666666666

5熟悉之中
627/1000
排名
4824
昨日变化
2

0

主题

204

帖子

627

积分

Rank: 5Rank: 5

UID
228538
好友
2
蛮牛币
869
威望
0
注册时间
2017-6-24
在线时间
165 小时
最后登录
2018-4-28
6#
发表于 2018-3-8 16:03:41 | 只看该作者
谢谢分享

7日久生情
1566/5000
排名
1068
昨日变化
2

0

主题

194

帖子

1566

积分

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

UID
148134
好友
0
蛮牛币
2483
威望
0
注册时间
2016-5-10
在线时间
452 小时
最后登录
2018-4-28

迈向小康

QQ
7#
发表于 2018-3-9 08:53:57 | 只看该作者
感谢楼主分享!

5熟悉之中
715/1000
排名
3627
昨日变化

3

主题

126

帖子

715

积分

Rank: 5Rank: 5

UID
197464
好友
1
蛮牛币
429
威望
0
注册时间
2016-12-30
在线时间
236 小时
最后登录
2018-4-28
8#
发表于 2018-3-9 10:59:54 | 只看该作者
不知道UNet是基于TCP还是UDP通讯,同步的延迟高吗?

6蛮牛粉丝
1251/1500
排名
2670
昨日变化
7

0

主题

365

帖子

1251

积分

Rank: 6Rank: 6Rank: 6

UID
126382
好友
0
蛮牛币
163
威望
0
注册时间
2015-10-22
在线时间
416 小时
最后登录
2018-4-27
9#
发表于 2018-3-9 14:44:33 | 只看该作者
#在这里受教了 帖子很好 支持快速回复#

4四处流浪
389/500
排名
16050
昨日变化
16

0

主题

247

帖子

389

积分

Rank: 4

UID
199204
好友
0
蛮牛币
106
威望
0
注册时间
2017-1-5
在线时间
106 小时
最后登录
2018-4-28
10#
发表于 2018-3-13 16:18:22 | 只看该作者
在这里受教了 帖子很好 支持

7日久生情
2056/5000
排名
881
昨日变化
2

1

主题

457

帖子

2056

积分

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

UID
26340
好友
1
蛮牛币
204
威望
0
注册时间
2014-5-23
在线时间
568 小时
最后登录
2018-4-28
11#
发表于 2018-3-16 10:22:58 | 只看该作者
撒打发士大夫撒旦发射点发

2初来乍到
111/150
排名
13019
昨日变化
4

0

主题

16

帖子

111

积分

Rank: 2Rank: 2

UID
267400
好友
0
蛮牛币
73
威望
0
注册时间
2018-2-1
在线时间
39 小时
最后登录
2018-4-28
12#
发表于 2018-3-17 11:44:40 | 只看该作者
感谢分享

7日久生情
1566/5000
排名
1068
昨日变化
2

0

主题

194

帖子

1566

积分

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

UID
148134
好友
0
蛮牛币
2483
威望
0
注册时间
2016-5-10
在线时间
452 小时
最后登录
2018-4-28

迈向小康

QQ
13#
发表于 2018-3-19 14:12:43 | 只看该作者
谢谢分享

5熟悉之中
813/1000
排名
2440
昨日变化
3

0

主题

97

帖子

813

积分

Rank: 5Rank: 5

UID
210517
好友
0
蛮牛币
2672
威望
0
注册时间
2017-3-7
在线时间
204 小时
最后登录
2018-4-27
14#
发表于 2018-3-24 14:41:21 | 只看该作者
谢谢分享

7日久生情
2241/5000
排名
501
昨日变化
3

5

主题

122

帖子

2241

积分

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

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

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

本版积分规则

关闭

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

快速回复 足球投注 返回列表
幸运农场开奖结果查询 | 411| 312| 470| 99| 336| 65| 710| 294| 269| 558|