我在对池化对象应用相对力时遇到问题。
我有一个对象池,里面有我所有的项目符号都可以重复使用。子弹在不使用时被禁用。
当玩家射击他的武器时,从对象池中拉出一颗子弹,并按以下顺序对子弹执行以下操作:
- 设置有效(真)
- 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);
}
}
在再次使用之前总是从池中重置项目。为池中的每种类型的对象设置一个函数,您可以轻松调用该函数来重置它们。由于子弹附有一个 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;
}
我是一名优秀的程序员,十分优秀!