【发布时间】:2019-12-18 18:58:40
【问题描述】:
问题:我的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;
}
通过调试,我知道玩家的生命值在正确的游戏对象上被减去。只有当玩家死亡时,才会发生这种“切换”。
【问题讨论】:
-
PlayerUnit.isDead是静态的吗?这可能会影响双方球员吗?A和B之间有什么区别?也许命名在客户端混淆了? -
@derHugo
PlayerUnit.isDead是静态的,但删除它不会改变任何东西。如果命名在客户端混淆,我不确定它是如何发生的,因为即使我删除了[Command]和[ClientRpc]属性(即使它们成为普通方法,与我完成播放器的方式完全相同运动)没有任何变化。此外,在同时运行客户端和主机时 - 我注意到在玩家 A 的屏幕上,玩家 A 在杀死玩家 B 时死亡。但在玩家 B 的屏幕上却相反。我已将此添加到问题中。
标签: c# unity3d networking