PlayerRef
概述
Fusion中的「玩家」是指具有NetworkRunner
的任何同儕節點,該同儕節點可以向Fusion提供玩家輸入;也就是除專用遊戲階段伺服器之外的任何同儕節點類型。
在本文檔中,將介紹識別和存取玩家資訊的各種方法。
玩家參照
每個可以為玩家控制的同儕節點提供輸入的NetworkRunner
都與一個名為PlayerRef
的唯一識別字相關聯。提供給玩家的PlayerRef
僅用作識別字,不包含任何玩家特定的資料。
玩家計數
此值是在任何給定時間可以連線到遊戲階段的最大玩家數量。
每個遊戲階段的預設最大PlayerCount
在NetworkProjectConfig
資產中由Simulation > Default Players
欄位全域定義。
建立新的遊戲階段時,PlayerCount
由傳遞給NetworkRunner.StartGame()
的可為空值的StartGameArgs.PlayerCount
值確定。如果StartGameArgs.PlayerCount
未被賦值(或設定為空值),則新遊戲階段將取而代之使用NetworkProjectConfig
中的Default Player
計數。
請注意,專用伺服器沒有PlayerRef
,也不代表玩家,因此它不計入PlayerCount
限制。這意味著PlayerCount
為4的遊戲階段支援:
- 1個主機端與3個客戶端
- 1個專用伺服器與4個客戶端
- 4個共享模式客戶端
定義一個玩家物件
玩家物件 是一種可選的便捷方式,可以將遊戲階段中的每個PlayerRef
與特定的NetworkObject
「虛擬人偶」相關聯。
每個PlayerRef
只能與一個NetworkObject
相關聯。此關聯將被連網,並在所有客戶端上自動複製。
使用NetworkRunner.SetPlayerObject(PLayerRef, NetworkObject)
方法設定PlayerRef
<-> NetworkObject
關聯。
- 在主機和伺服器模式下:玩家物件 只能由主機/伺服器設定。
- 在共享模式下:每個玩家只能設定自己的 玩家物件 關聯,並且該玩家還必須對關聯的
NetworkObject
擁有狀態授權。
任何同儕節點都可以透過NetworkRunner.TryGetPlayerObject(PlayerRef, out NetworkObject)
方法擷取與特定PlayerRef
關聯的NetworkObject
。
C#
// On Player Joined, create and define a Player Object.
void OnPlayerJoined(PlayerRef player, NetworkRunner runner){
if (Object.HasStateAuthority == false) return;
var plObject = runner.Spawn(PlayerObjectPrefab);
var plData = plObject.GetComponent<PlayerData>();
//SetData defines the PlayerRef for that NB and a life amount.
plData.SetData(player, 3);
runner.SetPlayerObject(player, plObject)
}
// When desired, get the Player Object.
int GetPlayerLife(PlayerRef player){
if (Runner.TryGetPlayerObject(player, out var plObject)){
return plObject.GetComponent<PlayerData>().Lifes;
}
Debug.LogError("Player Object Not found")
return 0;
}
狀態授權
每個NetworkObject
都有一個與StateAuthority
關聯的PlayerRef
。StateAuthority
控制著NetworkObject
的狀態,例如其Networked Properties
。對狀態授權上的Networked Property
所做的任何更改都會透過網路複製到其他客戶端。
Host/Server Mode
:始終是伺服器/主機,沒有玩家對遊戲狀態擁有狀態授權。Share dMode
:權力是分散的,在玩家之間共享。任何玩家都可以對任何尚未被指派狀態授權,或在網路物件上將Allow StateAuthorityOverride
設定為真的物件擁有狀態授權。當物件被生成並透過調用NetworkObject.ReleaseStateAuthority()
與NetworkObject.RequestStateAuthority()
來換手時,可以指派狀態授權。
輸入授權
除了StateAuthority
之外,NetworkObject
還可以具有InputAuthority
。輸入授權僅在Shared/Host Mode
下相關。
一個玩家可以對多個NetworkObjects
擁有輸入授權。當玩家對NetworkObject
擁有輸入授權時,它可以發送輸入,伺服器在查找該特定物件的輸入時會捕獲它們。這是從客戶端到伺服器的主要通信方式。有關輸入的更多資訊,請閱讀玩家輸入
單一機器上的多重本機玩家
如果遊戲允許單一NetworkRunner
上有多個本機實體玩家(例如,本機合作式遊戲與線上玩家相結合),那麼需要特定於遊戲的邏輯來區分本機玩家,而獨立於Fusion的「玩家」概念。來自多個本機玩家的所有輸入必須合併到Fusion的輸入系統中,使用一個網路輸入結構來保存所有本機玩家輸入的資料。
注意事項: 當使用依賴於PlayerRef
的函數(如SetPlayerObject
或OnPlayerJoined
)時,本機多個玩家需要額外的自訂邏輯。