在添加新力之前从 Rigidbody 移除先前的力
Remove previous force from Rigidbody before adding new force
我在对池化对象应用相对力时遇到问题。
我有一个对象池,其中包含我所有的项目符号,可以重新使用。子弹在不使用时被禁用。
当玩家射击他的武器时,从对象池中拉出一颗子弹,并按以下顺序对子弹进行以下操作:
- SetActive(真)
- transform.position = bulletSpawnPosition
- transform.rotation = gun/barrel
的旋转
- RigidBody.AddRelativeForce(Vector3.forward * 速度, ForceMode.Impulse)
这只适用于一名玩家。当我有另一个玩家也从对象池中拉子弹时,子弹似乎保持了前一个玩家的旋转,所以力的方向是错误的。
我 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
并且当您从水池中取出它时它仍在移动,只需重置 velocity
和 angularVelocity
以防它仍在旋转。您可以通过将它们设置为 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);
我在对池化对象应用相对力时遇到问题。
我有一个对象池,其中包含我所有的项目符号,可以重新使用。子弹在不使用时被禁用。
当玩家射击他的武器时,从对象池中拉出一颗子弹,并按以下顺序对子弹进行以下操作:
- SetActive(真)
- transform.position = bulletSpawnPosition
- transform.rotation = gun/barrel 的旋转
- RigidBody.AddRelativeForce(Vector3.forward * 速度, ForceMode.Impulse)
这只适用于一名玩家。当我有另一个玩家也从对象池中拉子弹时,子弹似乎保持了前一个玩家的旋转,所以力的方向是错误的。
我 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
并且当您从水池中取出它时它仍在移动,只需重置 velocity
和 angularVelocity
以防它仍在旋转。您可以通过将它们设置为 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);