在添加新力之前,从Rigidbody移除先前的力

时间:2017-11-21 13:28:37

标签: c# unity3d game-physics

我在将相对力量应用于合并对象时遇到了麻烦。

我有一个对象池,我的所有子弹都可以重复使用了。子弹在不使用时被禁用。

当玩家射击他的武器时,从物体池中拉出一颗子弹,并按照以下顺序在子弹上完成以下操作:

  • SETACTIVE(真)
  • transform.position = bulletSpawnPosition
  • transform.rotation =枪/枪的旋转
  • RigidBody.AddRelativeForce(Vector3.forward * speed,ForceMode.Impulse)

这适用于一个玩家。当我有另一个从对手池中拉出子弹的玩家时,子弹似乎保持前一个玩家的旋转,所以力量被添加到错误的方向。

我可以/可以做的一件事是等待下一帧,在设置旋转和施加相对力之间,但这感觉不对。 我错过了什么吗?下面的代码略有修改,但缩小到了正在发生的事情。

function Shoot() {
    GameObject poolObject = GetObjectFromPool();
    poolObject.SetActive(true);
    poolObject.transform.position = transform.position;
    poolObject .transform.rotation = transform.rotation;

    if (poolObject != null)
    {
        //add force
        Rigidbody rBody = poolObject.GetComponent<Rigidbody>();
        rBody.AddRelativeForce(Vector3.forward * ProjectileSpeed.Value, ForceMode.Impulse);
    }
}

2 个答案:

答案 0 :(得分:2)

在再次使用它们之前,始终重置池中的项目。为池中的每种类型的对象提供一个函数,您可以轻松调用它来重置它们。由于子弹附有Rigidbody并且当您从游泳池中取出时它仍在移动,因此只需重置velocityangularVelocity,以防万一它仍在旋转。您可以将它们设置为Vector3(0, 0, 0);Vector3.zero属性是new Vector3(0, 0, 0);的快捷方式,应在此处使用。

这应该这样做:

public void resetPool(Rigidbody rg)
{
    rg.velocity = Vector3.zero;
    rg.angularVelocity = Vector3.zero;
}

答案 1 :(得分:1)

我发现了问题,它与在设置位置和旋转之前调用SetActive有关:

这会导致问题:

 poolObject.SetActive(true);
 poolObject.transform.position = transform.position;
 poolObject .transform.rotation = transform.rotation;

虽然这有效:

  poolObject.transform.position = transform.position;
  poolObject .transform.rotation = transform.rotation;
  poolObject.SetActive(true);