簡體   English   中英

統一網絡 | ClientRpc 在錯誤的玩家對象上被調用

[英]Unity Networking | ClientRpc being called on the wrong player object

問題:我的RpcDie方法被錯誤的RpcDie調用。

即:當玩家 A 殺死玩家 B 時,死亡的是玩家 A - 而不是玩家 B。

但這只是局部的。 所以上面的行為只發生在玩家 A 的游戲中,而在玩家 B 的游戲中,一切似乎都在按預期發生。 反之亦然。

所以:玩家 A 殺死了玩家 B。從玩家 A 的角度來看,他們已經死了,而玩家 B 還活着。 從玩家 B 的角度來看,他們已經死了,而玩家 A 還活着。


在我的PlayerHealth腳本的Update方法中,我檢查玩家的 hp 是否小於 1。如果是,則調用CmdDie方法:

if (playerHealth < 1)
     CmdDie(); 

CmdDie我調用我的RpcDie方法:

// Calls RpcDie
[Command]
public void CmdDie ()
{
    RpcDie(); 
}

// Removes the player from the game when killed by another player
[ClientRpc]
void RpcDie ()
{
    // Checks
    if (!isLocalPlayer || PlayerUnit.isDead) return;

    // Toggles + updates     
    StopAllCoroutines(); 
    GameObject.Find("MapManager").GetComponent<GameManager>().playerCount--;
    GetComponent<Renderer>().enabled = false;
    PlayerUnit.isDead = true; 

    // Ragdoll
    ragdoll.SetActive(true); 
    foreach (Transform t in ragdoll.transform) 
       t.transform.position = gameObject.transform.position;
}

從調試中我知道玩家的健康在正確的游戲對象上被減去。 只有當玩家死亡時才會發生這種“轉換”。

根據我的假設, playerHealth並沒有說明玩家實際上是誰; 無論是Player A還是Player B 腳本不知道應該減少Player B而不是Player A生命值。

每個玩家都有一個PlayerID 因此, Player A將擁有PlayerID: 1Player B將擁有PlayerID: 2

更具技術性的場景是客戶端到服務器的通信。 Player A想要攻擊Player B ,客戶端(也就是Player A )會向服務器發送一個RPC請求,他要攻擊Player B

服務器將收到一個“包”包含從該信息一起發送RPC ,包括: PlayerID其發起攻擊(在這種情況下, PlayerID: 1 (A)),以及其他PlayerID誰被攻擊( PlayerID: 2 )。 數據包中會有更多信息,例如WeaponID等。

最后,服務器會向每個人發送另一個RPC ,其偽代碼類似於ReducePlayerHealth(int playerID, int healthAmount, RPC.NotifyAll)

該方法將向游戲中的每個玩家發送一個數據包,客戶端將在該數據包中降低該特定玩家的健康狀況。 服務器必須始終處於指揮狀態; 因此,服務器設置數據,客戶端讀取數據。

PS:不得不將其作為答案發布,因為我無法在您問題的評論部分下輸入更多字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM