文档章节

Unity网络多玩家游戏开发教程第1章Unity自带网络功能

大学霸
 大学霸
发布于 2014/10/30 10:48
字数 1439
阅读 1134
收藏 24

Unity网络多玩家游戏开发教程第1Unity自带网络功能

Unity拥有大量的第三方插件,专门提供了对网络功能的支持。但是,大部分开发者第一次接触到的还是Unity自带的网络功能,也就是大家经常说到的Unity Networking API。这些API是借助于组件NetworkView发挥作用的,而它可以简化开发者大量的网络功能编码任务。本文选自《Unity网络多玩家游戏开发教程(大学霸内部资料)》

NetworkView组件

Unity中,NetworkView组件用于处理游戏在网络上的数据传输,通常负责具体的游戏对象的状态数据串行化(state serialization)。例如,将游戏对象上TransformRigidbodyAnimation组件的数据串行化到网络上。本文选自Unity网络多玩家游戏开发教程(大学霸内部资料)》

为游戏对象添加NetworkView组件的方法是,单击Component|Miscellaneous|Network View命令,此组件如图1-所示。本文选自Unity网络多玩家游戏开发教程(大学霸内部资料)》

1-  NetworkView组件

提示:此组件被添加到了游戏场景中默认创建的对象Main Camera上。

State Synchronization:表示要同步(串行化)的状态信息;本文选自Unity网络多玩家游戏开发教程(大学霸内部资料)》

提示:此属性有3个可选项。Off表示不需要同步任何状态;Reliable Delta Compressed表示使用可靠的数据传输方式,且只传输变化了的数据,若没有变化,那么就不会传输任何数据;Unreliable表示要使用不可靠的数据传输方式,每次都传输同类型的数据,即时数据没有发生变化(需要占用更大的带宽)。

q  Observed:表示要同步的信息的类型;

提示:示例中要同步的信息的类型是Transform组件上的数据。

q  ID:唯一的标识特定对象上的Network view组件;

提示:多人网络游戏中,同一对象的此ID值是一致的。

自定义串行化数据

上一节讲解了使用NetworkView组件指定串行化数据的方法,例如数据类型是Transform组件上的数据,就要为NetworkView组件上的Observed属性指定为特定对象上的Transform组件。而本节就来说明在脚本中自定义串行化数据的方法,数据的类型同样是Transform组件上的数据。本文选自Unity网络多玩家游戏开发教程(大学霸内部资料)》

Project视图里,新建C#脚本,命名为ExampleUnityNetworkSerializePosition,并添加下面的代码:

  • 01     using UnityEngine;

  • 02     using System.Collections;

  • 03    

  • 04     public class ExampleUnityNetworkSerializePosition : MonoBehaviour

  • 05     {

  • 06              public void OnSerializeNetworkView( BitStream stream, NetworkMessageInfo info )

  • 07              {

  • 08                       //判断当前是否打算向网络上写入数据

  • 09                       if( stream.isWriting )

  • 10                       {

  • 11                                 //写入对象的位置信息

  • 12                                 Vector3 position = transform.position;

  • 13                                 stream.Serialize( ref position );

  • 14                       }

  • 15                       //当前正在从网络上读取数据

  • 16                       else

  • 17                       {

  • 18                                 //将读取到的数据存储到Vector3类型的变量中

  • 19                                 Vector3 position = Vector3.zero;

  • 20                                 stream.Serialize( ref position );

  • 21                                 //实时修改对象的位置

  • 22                                 transform.position = position;

  • 23                       }

  • 24              }

  • 25     }

q  脚本06行,OnSerializeNetworkView()方法会被Unity主动调用,用于串行化自定义的数据;

BitStream类表示串行化的数据,它有两个变量IsReadingIsWriting,分别用于判断当前处于读取,还是写入状态;本文选自Unity网络多玩家游戏开发教程(大学霸内部资料)》

q  BitStream类依据当前的读取,或者写入状态,调用自己的Serialize()方法从流中读取数据,或者写入数据到流中;

使用远程过程调用

远程过程调用(RPCRemote Procedure Calls)的作用是,为了达到多人游戏的同步效果,调用远程机器上,特定对象上的方法。例如,玩家自己的角色在当前的机器上发射了子弹,那么处于同一游戏中的其它玩家,也应该在它们的机器上,看到那个角色发射了子弹。本节就来说明在脚本中使用远程过程调用的方法。本文选自Unity网络多玩家游戏开发教程(大学霸内部资料)》

Project视图里,新建C#脚本,命名为ExampleUnityNetworkCallRPC,并添加下面的代码:本文选自Unity网络多玩家游戏开发教程(大学霸内部资料)》

  • 01     using UnityEngine;

  • 02     using System.Collections;

  • 03    

  • 04     public class ExampleUnityNetworkCallRPC : MonoBehaviour

  • 05     {

  • 06              void Update()

  • 07              {

  • 08                       //如果此NetworkView组件不属于此对象,就不做任何反应

  • 09                       if( !networkView.isMine )

  • 10                                 return;

  • 11                       //当按下空格键的时候,调用所有同一游戏中,同一对象上的testRPC方法

  • 12                       if( Input.GetKeyDown( KeyCode.Space ) )

  • 13                                 networkView.RPC( "testRPC", RPCMode.All );

  • 14              }

  • 15              [RPC]

  • 16              void testRPC( NetworkMessageInfo info )

  • 17              {

  • 18                       //记录调用此方法的电脑所在的IP地址

  • 19                       Debug.Log( "Test RPC called from " + info.sender.ipAddress );

  • 20              }

  • 21     }

q  远程过程调用就是使用networkView.RPC()方法,第一个参数表示要远程调用的方法名,第二个参数表示接收远程调用的主机;

q  脚本15行的属性标记是必不可少的;

提示:networkView.RPC()方法的第二个参数,有5个可选项,如图1-所示,分别表示只发送给服务器、除发送者以外的所有主机、除发送者以外的所有主机并添加到缓存、所有主机,以及所有主机并添加到缓存。

1-  networkView.RPC()方法第二个参数的可选项

 


© 著作权归作者所有

大学霸
粉丝 270
博文 908
码字总数 557321
作品 0
东城
程序员
私信 提问
加载中

评论(1)

小林鑫
你可以做手机游戏辅助吗
OSC 第 98 期高手问答 —— Unity 游戏开发

OSCHINA 本期高手问答( 11月10 日- 11月17日)我们请来了《Unity 5.x游戏开发指南》 的作者@风宇冲 来解答 Unity 游戏开发 方面的问题。 罗盛誉,@风宇冲 ,笔名风宇冲,毕业于美国西俄勒冈大...

叶秀兰
2015/11/10
5.2K
50
Unity 和腾讯游戏成立联合创新实验室:从技术创新探索游戏产品新模式和概念

2019年5月12日,Unity和腾讯游戏共同宣布成立联合创新实验室。双方将充分发挥各自深耕在游戏领域多年的技术优势,协同创新、共同探索未来游戏产品新模式和概念,致力于技术上的飞跃性突破,为...

CSDN资讯
05/12
0
0
最后1天,购票渠道即将关闭!Unite 2018开发者大会全日程公布

Unite Beijing 2018将于5月11日-13日在北京国家会议中心盛大召开!(网络购票渠道将于明日中午关闭,有需要的朋友抓紧购买,购票地址:大会官网) 作为全球规模最大的Unity开发者聚会,历年U...

yssycz
2018/05/09
0
0
【专栏精选】实战:使用LeanCloud实现玩家注册

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/zhenghongzhi6/article/details/90634283 本文节选自洪流学堂公众号技...

关尔Manic
05/28
0
0
Unity开发者制作iOS、安卓手机游戏的常用Unity插件推荐合集

越来越多的移动游戏开发者选择使用Unity进行开发,Unity还可以开发跨平台APP。本文推荐了一些用Unity开发手机游戏时的一些常用插件,希望可以帮助到各位开发者。 1:Ultimate Mobile Pro 包含...

Unity老司机
08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
14
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部