zoukankan      html  css  js  c++  java
  • Unity多玩家网络游戏开发教程1章Unity带有网络功能

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


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

     


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

  • 相关阅读:
    android studio中timber的配置
    bufferknife框架的正确使用方式 -终于他么知道了
    开源的图像滤镜库----for Android
    HSV做通道分离是出现的Vector内存越界错误
    HSV与RGB的相互转换的公式
    Windows下python的第三方库的安装
    Python出现"Non-ASCII character 'xe6' in file"错误解决方法
    Verilog的IDE Quartus II
    Java-ZipUtil工具类
    Java-JDBCUtil工具类
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4658116.html
Copyright © 2011-2022 走看看