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上。spa

State Synchronization:表示要同步(串行化)的狀態信息;本文選自Unity網絡多玩家遊戲開發教程(大學霸內部資料)》插件

提示:此屬性有3個可選項。Off表示不須要同步任何狀態;Reliable Delta Compressed表示使用可靠的數據傳輸方式,且只傳輸變化了的數據,若沒有變化,那麼就不會傳輸任何數據;Unreliable表示要使用不可靠的數據傳輸方式,每次都傳輸同類型的數據,即時數據沒有發生變化(須要佔用更大的帶寬)。orm

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-所示,分別表示只發送給服務器、除發送者之外的全部主機、除發送者之外的全部主機並添加到緩存、全部主機,以及全部主機並添加到緩存。

1-  networkView.RPC()方法第二個參數的可選項

相關文章
相關標籤/搜索