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-所示,分别表示只发送给服务器、除发送者以外的所有主机、除发送者以外的所有主机并添加到缓存、所有主机,以及所有主机并添加到缓存。
图1- networkView.RPC()方法第二个参数的可选项
来源:oschina
链接:https://my.oschina.net/u/1585857/blog/338737