我在将相对力量应用于合并对象时遇到了麻烦。
我有一个对象池,我的所有子弹都可以重复使用了。子弹在不使用时被禁用。
当玩家射击他的武器时,从物体池中拉出一颗子弹,并按照以下顺序在子弹上完成以下操作:
这适用于一个玩家。当我有另一个从对手池中拉出子弹的玩家时,子弹似乎保持前一个玩家的旋转,所以力量被添加到错误的方向。
我可以/可以做的一件事是等待下一帧,在设置旋转和施加相对力之间,但这感觉不对。 我错过了什么吗?下面的代码略有修改,但缩小到了正在发生的事情。
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);
}
}
答案 0 :(得分:2)
在再次使用它们之前,始终重置池中的项目。为池中的每种类型的对象提供一个函数,您可以轻松调用它来重置它们。由于子弹附有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;
}
答案 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);