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

扫一扫,访问微社区

开发者专栏

关注:2309

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

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

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

[alayeshi] Unity5之Network子弹发射客户端同步显示

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

72

主题

312

帖子

1518

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
11
蛮牛币
2405
威望
0
注册时间
2014-11-12
在线时间
450 小时
最后登录
2018-9-19

专栏作家

发表于 2018-6-14 09:36:09 | 显示全部楼层 |阅读模式

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

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

x

接着上一篇博客,继续讲解Network的功能。本节讲,如何发射子弹,并且同步到各个客户端

下来我们先做第一步,单机版如何生成子弹发射。

首先把在主角下制作一个Spawn用来做生成点。


然后做一个子弹命名为bullet,要给子弹加个Rigidbody组件,因为我们要使用这个方法让子弹飞。


接下开始写代码,如下:

[csharp] view plain copy



  • using UnityEngine;  
  • using System.Collections;  
  • using UnityEngine.Networking;  
  • public class playernetwork : NetworkBehaviour  
  • {  
  •   
  •     [SerializeField]  
  •     public Camera fpscamera;  
  •     public GameObject CUBE;  
  •     public GameObject Bulletprefab,Spawn;  
  •   
  •     // Use this for initialization  
  •     void Start()  
  •     {  
  •   
  •         if (isLocalPlayer)//只有本客户端的角色才会执行  
  •   
  •         {  
  •             GetComponent<CharacterController>().enabled = true;  
  •             GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().enabled = true;  
  •             fpscamera.enabled = true;            
  •   
  •         }  
  •     }  
  •     void Update()  
  •     {  
  •         //不是本地角色就返回  
  •         if (isLocalPlayer == false)  
  •         {  
  •             return;  
  •         }  
  •   
  •         if (Input.GetKeyDown(KeyCode.K))  
  •         {  
  •             Debug.Log("FIRE");  
  •             Fire();  
  •         }  
  •     }  
  •     //生成子弹方法  
  •     void Fire()  
  •     {  
  •         GameObject bullets = Instantiate(Bulletprefab,Spawn.transform.position, Spawn.transform.rotation)as GameObject;  
  •   
  •         bullets.GetComponent<Rigidbody>().velocity=bullets.transform.forward*30f;  
  •   
  •         //两秒后销毁  
  •         Destroy(bullets,2);  
  •     }  
  •     /// <summary>  
  •     /// 这个方法只会在本地角色那里调用,当角色被创建的时候就被调用  
  •     /// </summary>  
  •     public override void OnStartLocalPlayer()  
  •     {  
  •         CUBE.GetComponent<MeshRenderer>().material.color = Color.blue;  
  •     }  
  • }  

接下来把对应的东西放到代码里对应的位置,如图:


这样按键盘K键就可以生成子弹,并且子弹向前飞走,在2秒后自动销毁。

--------------------------------------上面是单机版生成子弹方法,下面讲如何在network里实现同步功能----------------------------------------------------------------------------------------------------------------------------------------------------

首先要明白,生成子弹的地方肯定是服务器,而客户端只是去看到。


子弹要同步飞行,那必须要添加上network Identity 和 network Transform组件,同时设置如下图:

这里解释一下设置:sync Rigidbody 3D是为了同步刚体进行子弹飞行。network send rate 是指要同步的频率,这里子弹只要同步一次能够飞行就可以了所以设置为0,表示同步速率就一次。

既然要在服务器生成,那必然要在networkmanager里添加上子弹的prefab,如图:

注意:要在networkmanager里添加的物体身上必须有network Identity组件(此处bullet已经添加过)。


接下来就是对代码的改动了,如下:

[csharp] view plain copy



  • using UnityEngine;  
  • using System.Collections;  
  • using UnityEngine.Networking;  
  • public class playernetwork : NetworkBehaviour  
  • {  
  •   
  •     [SerializeField]  
  •     public Camera fpscamera;  
  •     public GameObject CUBE;  
  •     public GameObject Bulletprefab, Spawns;  
  •   
  •     // Use this for initialization  
  •     void Start()  
  •     {  
  •   
  •         if (isLocalPlayer)//只有本客户端的角色才会执行  
  •   
  •         {  
  •             GetComponent<CharacterController>().enabled = true;  
  •             GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().enabled = true;  
  •             fpscamera.enabled = true;  
  •   
  •         }  
  •     }  
  •     void Update()  
  •     {  
  •         //不是本地角色就返回  
  •         if (isLocalPlayer == false)  
  •         {  
  •             return;  
  •         }  
  •   
  •         if (Input.GetKeyDown(KeyCode.K))  
  •         {  
  •             Debug.Log("FIRE");  
  •             CmdFire();  
  •         }  
  •     }  
  •     //生成子弹方法 ---加上了command后,此方法虽然写在了客户端代码里,但在服务端运行;而且方法名必须以Cmd开头!!!  
  •     [Command]  
  •     void CmdFire()  
  •     {  
  •         GameObject bullets = Instantiate(Bulletprefab, Spawns.transform.position, Spawns.transform.rotation) as GameObject;  
  •   
  •         bullets.GetComponent<Rigidbody>().velocity = bullets.transform.forward * 30f;  
  •         //两秒后销毁  
  •         Destroy(bullets, 2);  
  •   
  •   
  •         //服务器把生成的子弹同步到全部客户端  
  •         NetworkServer.Spawn(bullets);  
  •   
  •   
  •     }  
  •     /// <summary>  
  •     /// 这个方法只会在本地角色那里调用,当角色被创建的时候就被调用  
  •     /// </summary>  
  •     public override void OnStartLocalPlayer()  
  •     {  
  •         CUBE.GetComponent<MeshRenderer>().material.color = Color.blue;  
  •     }  
  • }  

这里来解释一下command 方法。在一个方法上面加上了[command]后,表示此方法虽然写在了客户端代码里,但会在服务端运行而不是在客户端运行;而且方法名必须以Cmd开头,所以把之前的Fire修改为了CmdFire。

NetworkServer.Spawn(bullets);这个是network里的一个方法,表示服务器把生成的子弹同步到全部客户端。否则此处,客户端是看不到有子弹生成的。

这样就完成了所有的功能了。运行效果如下(一个客户端,一个服务器端):





回复

使用道具 举报

排名
2625
昨日变化
2

72

主题

312

帖子

1518

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
11
蛮牛币
2405
威望
0
注册时间
2014-11-12
在线时间
450 小时
最后登录
2018-9-19

专栏作家

 楼主| 发表于 2018-6-19 11:14:30 | 显示全部楼层
看到评论里大家都说第一个图片刷不出来,我这边看到的是没有问题的,应该是蛮牛的编辑器出现的问题。我把第一张图片发到这里。如下:

12222222.png


回复 支持 反对

使用道具 举报

4四处流浪
344/500
排名
5394
昨日变化
39

3

主题

8

帖子

344

积分

Rank: 4

UID
277425
好友
0
蛮牛币
797
威望
0
注册时间
2018-4-16
在线时间
87 小时
最后登录
2018-9-19
发表于 2018-6-15 09:40:40 | 显示全部楼层
看不到图片
[发帖际遇]: coldwind8112 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

4四处流浪
480/500
排名
6963
昨日变化
3

0

主题

163

帖子

480

积分

Rank: 4

UID
243107
好友
0
蛮牛币
634
威望
0
注册时间
2017-9-13
在线时间
143 小时
最后登录
2018-7-27
发表于 2018-6-15 10:54:22 | 显示全部楼层

回复

使用道具 举报

排名
61451
昨日变化
34

0

主题

12

帖子

21

积分

Rank: 1

UID
25988
好友
0
蛮牛币
5
威望
0
注册时间
2014-5-21
在线时间
7 小时
最后登录
2018-6-19
发表于 2018-6-15 10:55:28 | 显示全部楼层
赞一个 图片刷不出来

回复 支持 反对

使用道具 举报

5熟悉之中
523/1000
排名
5575
昨日变化
4

2

主题

141

帖子

523

积分

Rank: 5Rank: 5

UID
252889
好友
2
蛮牛币
1836
威望
0
注册时间
2017-11-6
在线时间
148 小时
最后登录
2018-8-24
QQ
发表于 2018-6-15 14:40:53 | 显示全部楼层

回复

使用道具 举报

5熟悉之中
512/1000
排名
9363
昨日变化
3

2

主题

291

帖子

512

积分

Rank: 5Rank: 5

UID
282383
好友
0
蛮牛币
477
威望
0
注册时间
2018-5-23
在线时间
109 小时
最后登录
2018-8-20
发表于 2018-6-16 21:14:38 | 显示全部楼层
多谢分享,多谢分享!!!

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1055/1500
排名
2909
昨日变化
9

1

主题

331

帖子

1055

积分

Rank: 6Rank: 6Rank: 6

UID
56245
好友
1
蛮牛币
2691
威望
0
注册时间
2014-11-18
在线时间
251 小时
最后登录
2018-9-19
发表于 2018-6-16 22:58:32 | 显示全部楼层
绝对是专家~

回复

使用道具 举报

排名
2625
昨日变化
2

72

主题

312

帖子

1518

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
11
蛮牛币
2405
威望
0
注册时间
2014-11-12
在线时间
450 小时
最后登录
2018-9-19

专栏作家

 楼主| 发表于 2018-6-19 11:04:37 | 显示全部楼层

我这里看到的没问题呀,那我重新传个。

回复 支持 反对

使用道具 举报

排名
2625
昨日变化
2

72

主题

312

帖子

1518

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
11
蛮牛币
2405
威望
0
注册时间
2014-11-12
在线时间
450 小时
最后登录
2018-9-19

专栏作家

 楼主| 发表于 2018-6-19 11:04:42 | 显示全部楼层

我这里看到的没问题呀,那我重新传个。

回复 支持 反对

使用道具 举报

排名
2625
昨日变化
2

72

主题

312

帖子

1518

积分

Rank: 9Rank: 9Rank: 9

UID
54986
好友
11
蛮牛币
2405
威望
0
注册时间
2014-11-12
在线时间
450 小时
最后登录
2018-9-19

专栏作家

 楼主| 发表于 2018-6-19 11:04:45 | 显示全部楼层

我这里看到的没问题呀,那我重新传个。

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1083/1500
排名
2282
昨日变化
2

0

主题

75

帖子

1083

积分

Rank: 6Rank: 6Rank: 6

UID
219425
好友
1
蛮牛币
1462
威望
0
注册时间
2017-4-26
在线时间
428 小时
最后登录
2018-9-19
发表于 2018-6-19 11:06:30 | 显示全部楼层

赞一个 图片刷不出来

回复 支持 反对

使用道具 举报

5熟悉之中
799/1000
排名
3653
昨日变化
3

39

主题

197

帖子

799

积分

Rank: 5Rank: 5

UID
216835
好友
2
蛮牛币
990
威望
0
注册时间
2017-4-9
在线时间
185 小时
最后登录
2018-9-16
发表于 2018-7-4 22:19:25 | 显示全部楼层
alayeshi 发表于 2018-6-19 11:14
看到评论里大家都说第一个图片刷不出来,我这边看到的是没有问题的,应该是蛮牛的编辑器出现的问题。我把第 ...

所有图片加载Ing,咋办很难受

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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