Unity多玩家网络游戏开发教程1章Unity带有网络功能
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带有网络功能的更多相关文章
- Cardboard开发教程:使用Unity制作Cardboard全景图片浏览器
这两年,虚拟现实(VR)领域很火,很多人认为这将会是下一个手机般改变人们生活的技术.目前全球最领先的还是Facebook旗下的Oculus,HTC VIVE,以及最流行的Cardboard.国内多家厂 ...
- Unity带有网络功能——创建服务,并连接到一个特定的服务
游戏本身需要在网络上创建服务,然后其他的游戏能够连接到这个服务,此外真实场景现在玩同样的游戏效果一起. 该方法是创建一个服务呼叫Network.InitializeServer( ): 是Networ ...
- [ABP教程]第二章 图书列表页面
Web应用程序开发教程 - 第二章: 图书列表页面 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开 ...
- [ABP教程]第一章 创建服务端
Web应用程序开发教程 - 第一章: 创建服务端 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发 ...
- EnjoyingSoft之Mule ESB开发教程系列第五篇:控制消息的流向-数据路由
目录 1. 使用场景 2. 基于消息头的路由 2.1 使用JSON提交订单的消息 2.2 使用XML提交订单的消息 2.3 使用Choice组件判断订单格式 3. 基于消息内容的路由 4. 其他控制流 ...
- (译)【Unity教程】使用Unity开发Windows Phone上的横版跑酷游戏
译者注: 目前移动设备的跨平台游戏开发引擎基本都是采用Cocos2d-x或者Unity.一般而言2d用cocos2d-x 3d用unity,但是对于Windows Phone开发者, cocos2d- ...
- 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑
使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...
- 使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍
使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍 Photon PUN Unity 网络游戏开发 Photon常用类介绍: IPunCallback PUNGIPunCa ...
- Unity 2D游戏开发教程之摄像头追踪功能
Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以 ...
随机推荐
- IT行业,需要经常锻炼,开篇从本钱开始
今天下完班,和部门兄弟一起去打了两小时乒乓球,大汗淋漓,很痛快. 败给了两个高手,感觉年龄大了些,灵活性没有以前那么好了. 想想以前读书时,在整个学校都叱诧风云,如今即败给了几个老手,唉. 看来以后要 ...
- Swift - 继承UIView实现自定义可视化组件(附记分牌样例)
在iOS开发中,如果创建一个自定义的组件通常可以通过继承UIView来实现.下面以一个记分牌组件为例,演示了组件的创建和使用,以及枚举.协议等相关知识的学习. 效果图如下: 组件代码:Score ...
- POJ 1330 Nearest Common Ancestors(Tarjan离线LCA)
Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...
- Oracle SQL语句执行过程
前言 QQ群讨论的时候有人遇到这样的问题:where子句中无法访问Oracle自定义的字段别名.这篇 博客就是就这一问题做一个探讨,并发散下思维,谈谈SQL语句的执行顺序问题. 问题呈现 直接给出SQ ...
- MFC 在对话框显示图片的多种方法
我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一 ...
- Sql Server中COUNT(字段名)跟COUNT(*)的特殊不同点
今天有个需求,有2张表: 1.一个“搜索记录”表search,一个“搜索后下载记录”表down 2.映射关系:每一个下载记录对应一条搜索记录, 第个 ...
- android自定义实现抽屉SlidingDrawer的功能
最近项目中需要实现上拉功能,首先想到的就是Android本身自带的抽屉SlidingDrawer,最后也实现了不过,出现的问题就是设置背景色问题,handler和content是两个不同的部分,这就造 ...
- Pyhon安装media模块
都是教科书惹的祸,它没有说清楚.media看着很标准,其实不是python自带的库.需要安装第三方软件后才能用. 在这里http://pythonhosted.org/PyGraphics/insta ...
- codeforces 659B Qualifying Contest
题目链接:http://codeforces.com/problemset/problem/659/B 题意: n个人,m个区.给出n个人的姓名(保证不相同),属于的区域,所得分数.从每个区域中选出成 ...
- 求第i个小的元素 时间复杂度O(n)
#include<iostream> //求第i个小的元素 时间复杂度O(n) #include<cstdlib> #include<ctime> using na ...