根据我的游戏要求,当两辆汽车相互碰撞并向后移动时,我会施加手动力。 所以我想要可以证明这一点的正确代码。这是我想获得的碰撞响应示例:
根据我的理解,我已经编写了这段代码:
Vector3 reboundDirection = Vector3.Normalize(transform.position - other.transform.position);
reboundDirection.y = 0f;
int i = 0;
while (i < 3)
{
myRigidbody.AddForce(reboundDirection * 100f, ForceMode.Force);
appliedSpeed = speed * 0.5f;
yield return new WaitForFixedUpdate();
i++;
}
我正在移动,我的汽车使用以下代码:
//Move the player forward
appliedSpeed += Time.deltaTime * 7f;
appliedSpeed = Mathf.Min(appliedSpeed, speed);
myRigidbody.velocity = transform.forward * appliedSpeed;
根据我的观察,我仍然没有在正确的方向上得到碰撞响应。获得高于图像参考碰撞响应的正确方法是什么?
答案 0 :(得分:1)
在您弄清为什么要使用手动力或如何处理Unity Engine产生的力之前,我想在您的方法中强调一个问题。您可以根据位置计算方向,但位置是汽车的中心。因此,您无法从下面的图片中看到正确的方向:
您计算两个枢轴或中心点之间的方向,因此,您的力在左侧图像中有些倾斜。替代此方法,您可以使用ContactPoint,然后计算方向。
作为更详细的信息,以便OP可以理解我所说的内容!在上图中,您可以看到带有蓝色矩形的区域。您将使用Collision.contacts
Vector3 centroid = new Vector3(0, 0, 0);
foreach (ContactPoint contact in col.contacts)
{
centroid += contact.point;
}
centroid = centroid / col.contacts.Length;
这是矩形的中心,用于查找需要的方向,如下所示:
Vector3 projection = gameObject.transform.position;
projection.x = centroid.x;
gameObject.GetComponent<Rigidbody>().AddForce((projection - centroid )*100, ForceMode.Impulse);
由于我不知道您的设置,所以我只是从汽车位置获得了y和z值,而从centroid
得到了x值,因此您得到一条蓝色的直线,而不是像第一个图像一样向左倾斜的箭头第二张图片的情况二。我希望我很清楚。