繁体   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