Network Object
元件概述
網路物件是一個帶有NetworkObject
元件的GameObject
,其代表房間中的一個單一網路實體
可以透過生成或作為場景物件來建立網路物件。
網路帳號
伺服器指派一個NetworkId
值到NetworkObject
元件,其為房間中該物件的唯一整數識別碼。這個NetworkId
在所有同儕節點之間是一致的,用於參照網路上的物件。
透過調用NetworkRunner.TryFindObject()
,可以找到具有此NetworkId
的本機網路物件執行個體。
生成網路物件
網路物件的產生方式有兩種;
- 調用
Runner.Spawn()
當調用生成時,會產生一個帶有網路物件元件的遊戲物件,並在網路上複製生成操作。在Runner.StartGame()
中傳送的INetworkObjectProvider
含有產生已生成物件的方式——無論是預製件具現化、複製現有物件、用程式碼建立新的自訂物件,還是從池中選取物件。 - 載入含有網路物件的場景
參見場景管理
這兩種方法都會產生物件並將其附加到伺服器上,並將該網路物件及其狀態複製給所有感興趣的同儕節點。
以Runner.Spawn()建立一個網路物件
Runner.Spawn()只能在主機模式下在伺服器上調用,或只能在共享模式下在打算成為已生成物件的狀態授權的客戶端上調用。調用時,指定的預製件被具現化,然後NetworkObject
元件被附加到NetworkRunner
。生成將被複製到對物件感興趣的其他客戶端。
預製件 / 物件表
生成網路物件通常涉及傳送一個用於具現化的預製件執行個體。為了使預製件參數對Fusion有意義(並確保所有客戶端都同意其到底是哪個預製件),預製件本身必須向Fusion註冊。在正常情況下,Fusion工具集會自動偵測這些預製件並註冊它們,但您也可以透過選擇網路專案設置並在Unity檢查器中按重建物件表來手動觸發此偵測。
在運行階段新增/移除網路行為
當建立網路物件後,就無法新增或移除網路行為。但是,可以在生成之前在運行階段新增/移除網路行為。不過,這樣做時有一些考慮因素:
NetworkObject
必須被內嵌(在這裡需要指引)- 自訂網路物件的具現化通常透過自訂的
INetworkObjectProvider
執行方式來處理。
鏈接到INetworkObjectProvider
鏈接到自訂執行方式上的技術展示
載入場景網路物件
用場景載入網路物件是產生和附加物件的另一種方法。當使用ISceneManager
執行個體載入場景時(參見場景管理),場景中任何啟用的網路物件都會附加在伺服器(伺服器模式)或主客戶端(共享模式)上。然後,將每個場景物件的被指派的NetworkId
傳送給所有其他客戶端,這些客戶端附加已載入的場景物件並將這些NetworkId
值指派給它們。
附加
當與場景一起生成或載入網路物件時,它將被附加。附加是指為網路物件指派其NetworkId
,為其NetworkBehaviour
元件的已連網屬性分配記憶體,並初始化所有相關的NetworkBehaviours
的過程。附加之後,NetworkObject
將在所有下層網路行為上調用Spawned()
。調用了所有這些Spawned()
方法之後,網路物件就被視為有效,其已連網屬性和RPC方法也將有效且可存取。所有相關的事件方法,如FixedUpdateNetwork()
和Render()
以及介面,都將開始被調用。
狀態授權
每個已附加的網路物件都有一個顯式或隱式的狀態授權,由玩家參照指定。如果Runner.StateAuthority
值為PlayerRef.None
,則伺服器同儕節點是隱式的狀態授權。
伺服器模式(主機端/專用/單一)
Runner.StateAuthority
將總是PlayerRef.None
——因為伺服器始終是狀態授權。狀態授權不能改變。
共享伺服器模式
NetworkObject.StateAuthority
將總是一個有效的PlayerRef
。狀態授權可以改變,但有一些限制:
- 無法指派狀態授權。玩家(即使他們現時擁有狀態授權)不能將狀態授權指派給另一個玩家。
- 可以獲得狀態授權。玩家可以調用
Object.RequestStateAuthority()
來嘗試獲取授權。
RequestStateAuthority()
只有滿足以下條件,才能成功;
NetworkObject.AllowStateAuthorityOverride
設定為真,或;- 先前的狀態授權已經調用
Object.ReleaseStateAuthority()
輸入授權
輸入授權特定於伺服器模式(主機、專用、單一),不適用於共享伺服器模式。輸入授權指示在調用GetInput()
時應為此物件傳回哪個玩家的輸入。
複製
附加後,網路物件會使用每個刷新進行模擬,狀態授權會將結果狀態複製給所有其他同儕節點。
重要事項: 網路屬性僅從狀態授權複製到其他同儕節點。當下一個授權狀態到達時,對其他同儕節點上的已連網屬性所做的任何更改都將被覆蓋。對於輸入授權,這是預測的正常部分,因為它將在已接收的伺服器狀態之前進行模擬,並在每次新的伺服器狀態到達時進行復原,然後再次向前重新模擬。
興趣管理
網路物件複製到哪些玩家,可以使用各種興趣管理機制(如興趣區域)進行篩選。興趣管理是一種基於排除對某些玩家的物件更新的資料縮減機制,對於具有大量網路物件和/或高玩家數的遊戲非常重要。
請參見興趣管理
巢狀
Fusion支持巢狀網路物件。巢狀是指一個網路物件遊戲物件是層次結構中另一個遊戲物件的下層。場景物件和已生成預製件可以是一個遊戲物件預製件上的多個網路物件。附加後,每個網路物件都被視為與其上層網路物件和下層網路物件分離的實體。網路行為將與最直接的上層相關聯,根網路物件不會附加屬於已巢狀下層網路物件的網路行為。
Back to top