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

Remove previous force from Rigidbody before adding new force

我在对池化对象应用相对力时遇到问题。

我有一个对象池,其中包含我所有的项目符号,可以重新使用。子弹在不使用时被禁用。

当玩家射击他的武器时,从对象池中拉出一颗子弹,并按以下顺序对子弹进行以下操作:

这只适用于一名玩家。当我有另一个玩家也从对象池中拉子弹时,子弹似乎保持了前一个玩家的旋转,所以力的方向是错误的。

我 can/could 做的一件事是等待下一帧,在设置旋转和应用相对力之间,但感觉不对。 我错过了什么吗?下面的代码略有修改,但缩小了范围。

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);
    }
}

在再次使用之前总是从池中重置项目。为池中的每种类型的对象设置一个函数,您可以轻松调用该函数来重置它们。由于子弹附有 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;
}

我发现了问题,它与在设置位置和旋转之前调用 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);