[英]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.