This document is about: FUSION 2
SWITCH TO

PlayerRef

概述

Fusion中的「玩家」是指具有NetworkRunner的任何同儕節點,該同儕節點可以向Fusion提供玩家輸入;也就是除專用遊戲階段伺服器之外的任何同儕節點類型。

在本文檔中,將介紹識別和存取玩家資訊的各種方法。

玩家參照

每個可以為玩家控制的同儕節點提供輸入的NetworkRunner都與一個名為PlayerRef的唯一識別字相關聯。提供給玩家的PlayerRef僅用作識別字,不包含任何玩家特定的資料。

玩家計數

此值是在任何給定時間可以連線到遊戲階段的最大玩家數量。

每個遊戲階段的預設最大PlayerCountNetworkProjectConfig資產中由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關聯的PlayerRefStateAuthority控制著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的函數(如SetPlayerObjectOnPlayerJoined)時,本機多個玩家需要額外的自訂邏輯。

Back to top