[英]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: 1
, Player 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.