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

Unity拥有大量的第三方插件。专门提供了对网络功能的支持。

可是。大部分开发人员第一次接触到的还是Unity自带的网络功能。也就是大家常常说到的Unity
Networking API。这些API是借助于组件NetworkView发挥作用的,而它能够简化开发人员大量的网络功能编码任务。本文选自《Unity网络多玩家游戏开发教程(大学霸内部资料)》

NetworkView组件

在Unity中,NetworkView组件用于处理游戏在网络上的传输数据,通常负责详细的游戏对象的状态数据串行化(state
serialization)。比如。将游戏对象上Transform、Rigidbody和Animation组件的数据串行化到网络上。本文选自《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类表示串行化的数据,它有两个变量IsReading和IsWriting。分别用于推断当前处于读取,还是写入状态。本文选自《Unity网络多玩家游戏开发教程(大学霸内部资料)》

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

使用远程过程调用

远程过程调用(RPC。Remote 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-所看到的。分别表示仅仅发送给server、除发送者以外的全部主机、除发送者以外的全部主机并加入到缓存、全部主机。以及全部主机并加入到缓存。

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


版权声明:本文博客原创文章,博客,未经同意,不得转载。

Unity多玩家网络游戏开发教程1章Unity带有网络功能的更多相关文章

  1. Cardboard开发教程:使用Unity制作Cardboard全景图片浏览器

    这两年,虚拟现实(VR)领域很火,很多人认为这将会是下一个手机般改变人们生活的技术.目前全球最领先的还是Facebook旗下的Oculus,HTC VIVE,以及最流行的Cardboard.国内多家厂 ...

  2. Unity带有网络功能——创建服务,并连接到一个特定的服务

    游戏本身需要在网络上创建服务,然后其他的游戏能够连接到这个服务,此外真实场景现在玩同样的游戏效果一起. 该方法是创建一个服务呼叫Network.InitializeServer( ): 是Networ ...

  3. [ABP教程]第二章 图书列表页面

    Web应用程序开发教程 - 第二章: 图书列表页面 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开 ...

  4. [ABP教程]第一章 创建服务端

    Web应用程序开发教程 - 第一章: 创建服务端 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发 ...

  5. EnjoyingSoft之Mule ESB开发教程系列第五篇:控制消息的流向-数据路由

    目录 1. 使用场景 2. 基于消息头的路由 2.1 使用JSON提交订单的消息 2.2 使用XML提交订单的消息 2.3 使用Choice组件判断订单格式 3. 基于消息内容的路由 4. 其他控制流 ...

  6. (译)【Unity教程】使用Unity开发Windows Phone上的横版跑酷游戏

    译者注: 目前移动设备的跨平台游戏开发引擎基本都是采用Cocos2d-x或者Unity.一般而言2d用cocos2d-x 3d用unity,但是对于Windows Phone开发者, cocos2d- ...

  7. 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑

    使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...

  8. 使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍

    使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍 Photon PUN Unity 网络游戏开发 Photon常用类介绍: IPunCallback PUNGIPunCa ...

  9. Unity 2D游戏开发教程之摄像头追踪功能

    Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...

随机推荐

  1. android解析xml一直报错org.xmlpull.v1.XmlPullParserException

     错误: org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT @1:2 injava.io.String ...

  2. Linux系统管理员必备的监控工具(88款)

    随着互联网行业的不断发展,各种监控工具多得不可胜数.这里列出网上最全的监控工具.让你可以拥有超过80种方式来管理你的机器.在本文中,我们主要包括以下方面: 命令行工具 网络相关内容 系统相关的监控工具 ...

  3. 14.2.5.7 Physical Row Structure 物理数据结构:

    14.2.5.7 Physical Row Structure 物理数据结构: InnoDB物理记录结构依赖行格式 在表创建的时候, 默认, InnoDB 使用Antelope 文件存储格式和它的压缩 ...

  4. 【android】下载文件至本应用程序的file文件夹或者sdcard

     一.推断是否有sdcard卡 //推断是否有SD卡 //ture:有SD卡 //false:没有SD卡 public boolean avaiableMedia(){ String status ...

  5. JSP/Servlet-----charset 、pageEncoding差别

    一.JSP/Servlet中的几个编码的作用         在JSP/Servlet中有4个地方可设置编码(例如以下).当中前两个仅仅能用于JSP中,后两个可用于JSP和Servlet 中.    ...

  6. 重拾linux

    重拾linux 起因 因为想重拾起linux,同时需要用docker起几个镜像,用来学习网络知识.本来想直接去阿里云上买,后来一想自己机器上,起一个linux是个不错的选择,毕竟不花钱! 还可以用来做 ...

  7. RegisterHotKey注册热键,然后响应WM_HOTKEY消息

    MSDN中的一个示例代码,步骤就是RegisterHotKey注册热键,然后响应WM_HOTKEY消息 @1:这个是系统热键 #include "stdafx.h" int _cd ...

  8. hdu1217Arbitrage--解题报告

    题意:套利,一个US币换取0.5 British pound,而1 British pound 换取10.0 French francs,同一时候 1 French franc buys 0.21 U ...

  9. 使用国内源解决Qt在线更新慢的问题

    Qt在线安装更新工具默认使用官方的源,国内访问比较慢,可以在setting中增加国内的源来提高更新速度,如下面的源: http://mirrors.ustc.edu.cn/qtproject/onli ...

  10. android 在你的UI中显示Bitmap - 开发文档翻译

    由于本人英文能力实在有限,不足之初敬请谅解 本博客只要没有注明“转”,那么均为原创,转贴请注明本博客链接链接 Displaying Bitmaps in Your UI 在你的UI中显示Bitmap ...