Unity新版網路-NetworkManager

來源:互聯網
上載者:User

標籤:invoke   管理   特性   開始菜單   轉換   lis   not   通過   com   

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)  

 

Unity新版網路-NetworkManager

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.