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-所示,分别表示只发送给服务器、除发送者以外的所有主机、除发送者以外的所有主机并添加到缓存、所有主机,以及所有主机并添加到缓存。

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

时间: 2024-08-06 11:50:36

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

Hands-On Unity 2018 x 移动游戏开发教程

Hands-On Unity 2018 x Game Development for Mobile 使用Unity 2018.2创建具有出色游戏功能的精彩游戏 想学习在Unity制作游戏,但不知道从哪里开始?现在,游戏开发比以往任何时候都更受欢迎,而且从未有过更好的时机. 本课程将教您从Unity到概念开发专业游戏所需的一切知识.您将学习最佳实践和技巧,无论您是想要独立开发还是被聘为Unity游戏开发人员.在本课程结束时,您将磨练必要的技能,开始您的游戏开发事业,所以现在就跳进去开始吧! 你会学

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

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

Unity 2D游戏开发教程之游戏中精灵的跳跃状态

Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却无法从低的地面移动到高的地面,因为当前的游戏精灵只能左右移动,即left和right.为了解决这个问题,本节就来为精灵添加跳跃状态.   图2-14  精灵从一个地面移动到另一个地面 (1)如果要为精灵添加跳跃状态,即jump,就不得不再引入其它状态: q   landing:用于表示精灵接触到地面

Unity 2D游戏开发教程之使用脚本实现游戏逻辑

Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态.但是这其中还有一些问题.例如,我们无法使用键盘控制精灵当前要进入的动画状态,而且精灵也只是在原地播放动画而已.但我们希望精灵在进入到PlayerWalkingAnimation状态时,位置应该发生改变. 要解决这些问题,就需要编写脚本.也就是说,要使用脚本来实现动画的播放控制,以及其它一些游戏的逻辑

Unity 2D游戏开发教程之游戏精灵的开火状态

Unity 2D游戏开发教程之游戏精灵的开火状态 精灵的开火状态 "开火"就是发射子弹的意思,在战争类型的电影或者电视剧中,主角们就爱这么说!本节打算为精灵添加发射子弹的能力.因为本游戏在后面会引入敌人,而精灵最好具备开火的能力,否则会被敌人轻易干掉!具体的实现方法是: (1)导入一个表示子弹的图片到Unity,本示例中选用的子弹图片,名为PlayerBullet,如图2-23所示. 图2-23  导入到游戏项目的表示子弹的图片 (2)拖动此图片到Scene视图,即可在当前的游戏场景中

Unity 2D游戏开发教程之为游戏场景添加多个地面

Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面.具体的操作方法是: (1)在Project视图里,新建一个文件夹,命名为Prefabs.然后将Hierarchy视图里的Platform对象,拖动到Prefabs文件夹中,如此一来就可以生成一个同名的预置资源,如图2-11所示. 图2-11  通过拖动对象到Project视图的方式,新建预置资源 (

Unity 2D游戏开发教程之精灵的死亡和重生

Unity 2D游戏开发教程之精灵的死亡和重生 精灵的死亡和重生 目前为止,游戏项目里的精灵只有Idle和Walking这两种状态.也就是说,无论精灵在游戏里做什么,它都不会进入其它的状态,如死亡.于是我们发现游戏里的精灵,即使是跳入“万丈深渊”,也依然存活,显然这种游戏逻辑无法让人接受.因此,本节就来说明为精灵添加死亡和重生这两种状态的方法,并使用脚本实现这两种状态的逻辑.具体的实现步骤如下: (1)在Hierarchy视图里,新建一个Empty对象,并命名为Death Trigger,设置其

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

Unity 2D游戏开发教程之摄像头追踪功能 上一章,我们创建了一个简单的2D游戏.此游戏中的精灵有3个状态:idle.left和right.这看起来确实很酷!但是仅有的3个状态却限制了精灵的能力,以及游戏逻辑的想象空间.看来有必要让精灵拥有更多的状态,而这就是本章要讲解的主要内容. 摄像头追踪功能 游戏里的精灵可以在游戏场景中任意移动,这没什么问题,可是这就导致了一个问题,就是精灵可能移动到我们的视野之外,或者说游戏视图之外.为了解决这个问题,很多游戏都采用了"摄像头追踪"的方法,使

Unity 3D正在革命游戏开发市场

转自知乎 [高风险的大型游戏开发] 传统上来说,开发游戏是一件费时费力的事情,而且80%的情况下开发游戏这件事就是一个灾难.因为游戏是一个交互艺术,这个交互不仅体现在娱乐方式上,也体现在开发过程中.修修补补是开发游戏的家常便饭.但是,由于传统的游戏开发至少涉及策划.美术和程序,因此任何一点微小的调整都需要各个环节通力合作才能勉强达成.而游戏的品质如何,往往要到最后开发出来一个版本才能看到.这时,项目往往已经开发到50%以上的进度了,无论做什么调整,都意味着巨大的先期投入. 然而幸运的是.虽然开发