Unity AddExplosionForce通过网络管理器同步

时间:2017-05-30 16:28:44

标签: unity3d unity-networking

我正在为Unity中的2位玩家开发一款3D游戏。游戏概念是一场太空竞赛,你必须通过环形飞行。作为另外一项功能,我想让玩家能够推动其他玩家。所以当他们按下一个特定的按钮时,他们的宇宙飞船会发出一个“冲击波”,击中另一个玩家并将他推回原点。我想通过Physics.OverlapSphere和AddExplosionForce函数来实现这一点。 我在一个没有网络功能的本地额外场景中进行了测试,效果非常好。

由于我想将该功能导入到真实游戏中,我遇到的问题是效果只是击中了本地玩家,而不是另一个。另一个只是奇怪地落后并且没有改变他的位置(在另一个游戏实例中也没有。这就像客户没有得到改变)。

我不得不说,我已经在使用网络管理器,并且“wasd”的正常运动对两个玩家都有效。

按照我正在使用的代码(这只是标准示例):

Vector3 explosionPos = transform.position;
Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);
foreach (Collider hit in colliders)
{
   Rigidbody rb = hit.GetComponent<Rigidbody>();

   if (rb != null)
   rb.AddExplosionForce(power, explosionPos, radius, 3.0F);
}

有人知道,如果有必要为网络添加内容吗?

1 个答案:

答案 0 :(得分:1)

尝试创建一个[Command]函数,该函数将使用您提供的代码运行[ClientRpc]函数。看起来应该是这样的:

[Command]
void CmdOnExplosion(float power, Vector3 explosionPos, float radius, float upwardsMod)
{
    RpcExplode(power, explosionPos, radius, upwardsMod);
}

[ClientRpc]
void RpcExplode(float power, Vector3 explosionPos, float radius, float upwardsMod)
{
    Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);

    foreach (Collider hit in colliders)
    {
        Rigidbody rb = hit.GetComponent<Rigidbody>();

        if (rb != null)
        {
            rb.AddExplosionForce(power, explosionPos, radius, 3.0F);
        }
    }
}