Unity擁有大量的第三方插件,專門提供了對網絡功能的支持。可是,大部分開發者第一次接觸到的仍是Unity自帶的網絡功能,也就是你們常常說到的Unity Networking API。這些API是藉助於組件NetworkView發揮做用的,而它能夠簡化開發者大量的網絡功能編碼任務。本文選自《Unity網絡多玩家遊戲開發教程(大學霸內部資料)》緩存
在Unity中,NetworkView組件用於處理遊戲在網絡上的數據傳輸,一般負責具體的遊戲對象的狀態數據串行化(state serialization)。例如,將遊戲對象上Transform、Rigidbody和Animation組件的數據串行化到網絡上。本文選自《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類表示串行化的數據,它有兩個變量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()方法第二個參數的可選項