Unity新版網絡-NetworkManager


NetworkManager是一個組件,用來管理網絡多人游戲的狀態。它實際上是完全使用HLAPI實現,所以它所做的一切程序員可以使用其他方式實現。然而,NetworkManager封裝好了很多有用的功能到一個地方,使創建、運行和調試多人游戲盡可能簡單。

NetworkManager可以使用使其完全沒有腳本。在編輯器的檢視面板,允許配置它的所有特性。NetworkManagerHUD供應一個簡單的、默認的用戶界面,允許網絡游戲在運行時由用戶控制。更先進的用法,開發人員可以從派生一個類繼承自NetworkManager,並且自定義其行為通過重寫任何它所提供的虛擬函數。

NetworkManager所具備的屬性包括如下:

  • 游戲狀態管理

  • 派生管理

  • 場景管理

  • Debugging信息

  • 比賽選擇(Matchmaker)

  • 用戶自定義

開始使用NetworkManager

NetworkManager可以作為核心控制組件在多人在線游戲中。開始,創建一個空的游戲對象在你的場景開始,或選擇一個方便管理的對象。然后加入NetworkManager組件。

在編輯器的檢視面板允許您配置和控制很多事情與網絡有關。

NetworkManagerHUD是另一個組件,它需要跟NetworkManager一起工作。它給你提供了一個簡單的用戶界面,顯示游戲運行控制網絡狀態。這是好的開始使用一個網絡項目,但不是作為一個游戲的最終的UI。

游戲狀態管理

網絡多人游戲可以運行在三種模式——作為一個客戶,作為一個專用的服務器,或者作為“主機”(同時是客戶端和服務器)。連網是為了實現同樣的游戲代碼和資產在所有這些情況下工作。發展為單人的游戲版本和多人的游戲版本應該是一樣的。

NetworkManager提供了方法進入每一個模式。

  • NetworkManager.StartClient()

  • NetworkManager.StartServer()

  • NetworkManager.StartHost()

都可用於腳本代碼,所以他們可以從鍵盤輸入調用處理程序或自定義的用戶界面。默認運行時控件還可以顯示調用這些函數。也有按鈕可用NetworkManagerHUD檢查員在播放模式,調用相同的功能。

Whatever method is used to change the game state, the properties networkAddress and networkPort are used. When a server or host is started, networkPort becomes the listen port. When a client is started, networkAddress is the address to connect to, and networkPort is the port to connect to.

無論使用何種方法來改變游戲狀態,使用networkAddress和networkPort屬性。當服務器或主機啟動時,networkPort變得監聽端口。當客戶端啟動,networkAddress地址連接,networkPort端口連接。

派生(網絡實例化)管理

In addition to the player prefab, the prefabs of other objects that will be dynamically spawned must be registered with the ClientScene. This can be done with the ClientScene.RegisterPrefab() functions, or it can be done by the NetworkManager automatically. Adding prefabs to the spawn list will make them be auto-registered. The spawn configuration section of the NetworkManager inspector looks like:

NetworkManager可以用於管理從預制實例化網絡對象。大多數游戲都有一個預設體作為主角對象,所以NetworkManager有一個位置使其拖動玩家預設體。當一個設置了一個玩家預設體,玩家對象將自動網絡實例化物體在每個用戶在游戲中。這適用於主機上的本地玩家,以及在遠程客戶端的遠程玩家。注意,玩家預設體必須添加NetworkIdentity組件。

除了玩家預設體之外,其他的預設體對象想動態地產生必須在ClientScene中注冊。這可以用ClientScene.RegisterPrefab()函數,也可以是由NetworkManager自動完成的。將預制體添加到列表中會讓他們被自動注冊。

一旦玩家預設體設置之后,應該能夠在開始游戲主機中看到玩家對象了。停止游戲應該看到玩家對象被銷毀。運行游戲的另一個副本和作為一個客戶端連接到localhost應該讓另一個玩家對象出現,和停止,客戶應客戶的player對象被銷毀。

玩家對象產生是調用了NetworkManager的默認方法:OnServerAddPlayer。如果你想定制玩家創建對象的方式,您可以重寫虛函數。默認實現是這樣的:

public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)  
{  
    var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);  
    NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);  
}  

注意NetworkServer.AddPlayerForConnection()函數必須用於創建新的玩家對象,這樣就建立了與客戶端的聯系。這將生成對象,所以NetworkServer.Spawn 不需要在玩家物體上調用。

開始位置

控制玩家在哪里產生,你可以使用NetworkStartPosition組件。NetworkManager尋找場景中NetworkStartPosition對象,如果它發現任何一個,那么它將在該位置產生玩家並且應用其中一個。自定義代碼可以訪問的可用NetworkStartPositions使列表通過NetworkManager.startPositions,還有一個幫助函數GetStartPosition()在NetworkManager中可用於實現OnServerAddPlayer找到一個起始位置。

場景管理

大多數游戲有多個場景。通常在屏幕至少有一個標題或開始菜單場景添加到實際的游戲場景中。NetworkManager設置了自動管理場景狀態和場景切換方式功能適用於一個多人游戲。NetworkManager有兩個槽,offlineScene和onlineScene。將場景拖到槽中可以激活網絡場景管理功能。

當服務器或主機啟動時,onlineScene場景將被加載。這將成為當前網絡場景。任何連接到服務器的客戶端也會加載這個場景。這個場景的名稱存儲在networkSceneName屬性中。

當網絡停止時(服務器或主機停止了),或由客戶端斷開,離線場景將被加載。這使得游戲斷開時自動回到菜單場景。

我們還可以在游戲中更改場景,通過調用方法NetworkManager.ServerChangeScene()。這將使所有當前連接的客戶端的變化場景,並將更新networkSceneName這樣新客戶也會加載到新場景。

當網絡場景管理激活時,任何調用游戲狀態管理功能會導致場景的變化,例如:NetworkManager.StartHost()或NetworkManager.StopClient(),這適用於運行時控制UI。通過設置場景和調用這些函數很容易控制多人在線游戲的場景同步。

注意,場景變化導致所有場景中的對象被銷毀。這可能包括NetworkManager!如果你想使其在場景切換過程中不銷毀,確保勾選“Dont Destroy On Load”設置為true。在簡單的情況下,這是最好的配置。但是,可以使其在每一個場景都有不同的NetworkManager來控制增量加載預制,或不同的場景轉換。

調試信息

NetworkManagerHUD屬性面板顯示網絡在運行時的狀態額外的信息。這包括:

  • 網絡連接
  • 服務器端:NetworkIdentity激活的對象
  • 客戶端:NetworkIdentity激活的對象
  • 同時在線客戶端

比賽安排(Matchmaking)

NetworkManager運行時UI和NetworkManager檢視面板UI允許與matchmaker server交互。函數NetworkManager.StartMatchmaker()使連接,並保存在NetworkManager.matchmaker屬性中。一旦被激活時,會改變默認的UI並執行回調函數使其簡單的完成matchmaking。

可以繼承NetworkManger重寫虛方法,實現自定義回調。

用戶自定義(Customization)

There are virtual functions on NetworkManager that derived classes can use to customize behaviour. When implementing these functions, be sure to take care of the functionality that the default implementations provide. For example, in OnServerAddPlayer(), the function NetworkServer.AddPlayer must be called to active the player object for the connection.

Functions invoked on the Server/Host:

繼承NetworkManager之后用戶可以根據需要重寫很多虛方法。重寫這些方法時,一定要注意方法原本實現的內容。例如,OnServerAddPlayer()函數, 必須調用方法NetworkServer。AddPlayer實現玩家對象的連接。

服務器/主機上調用的方法有:

// 當有客戶端連接時調用  
public virtual void OnServerConnect(NetworkConnection conn);  
   
// 當有客戶端斷開時調用  
public virtual void OnServerDisconnect(NetworkConnection conn)  
{  
    NetworkServer.DestroyPlayersForConnection(conn);  
}  
   
// 當有客戶端准備(Ready)時調用  
public virtual void OnServerReady(NetworkConnection conn)  
{  
    NetworkServer.SetClientReady(conn);  
}  
   
// 當生成對象到客戶端時調用  
public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)  
{  
    var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);  
    NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);  
}  
   
// 當玩家從客戶端銷毀時調用  
public virtual void OnServerRemovePlayer(NetworkConnection conn, short playerControllerId)  
{  
    PlayerController player;  
    if (conn.GetPlayer(playerControllerId, out player))  
    {  
        if (player.NetworkIdentity != null && player.NetworkIdentity.gameObject != null)  
            NetworkServer.Destroy(player.NetworkIdentity.gameObject);  
    }  
}  
   
// 當服務器發生錯誤時調用  
public virtual void OnServerError(NetworkConnection conn, int errorCode);  

在客戶端調用的方法:

// 當連接到服務器時調用  
public virtual void OnClientConnect(NetworkConnection conn)  
{  
    ClientScene.Ready(conn);  
    ClientScene.AddPlayer(0);  
}  
   
// 當斷開服務器時調用  
public virtual void OnClientDisconnect(NetworkConnection conn)  
{  
    StopClient();  
}  
   
// 當網絡問題時調用  
public virtual void OnClientError(NetworkConnection conn, int errorCode);  
   
// 告訴服務器沒准備好時調用   
public virtual void OnClientNotReady(NetworkConnection conn);  

Matchmaker會調用的方法:

//當有一個比賽創建  
public virtual void OnMatchCreate(CreateMatchResponse matchInfo)  
   
//當接收到比賽列表時調用  
public virtual void OnMatchList(ListMatchResponse matchList)  
   
//當假如比賽時調用  
public void OnMatchJoined(JoinMatchResponse matchInfo)  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM