汽车碰撞返回力-3D汽车游戏

时间:2019-02-11 11:45:11

标签: unity3d

根据我的游戏要求,当两辆汽车相互碰撞并向后移动时,我会施加手动力。 所以我想要可以证明这一点的正确代码。这是我想获得的碰撞响应示例:

enter image description here

根据我的理解,我已经编写了这段代码:

 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;

根据我的观察,我仍然没有在正确的方向上得到碰撞响应。获得高于图像参考碰撞响应的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

在您弄清为什么要使用手动力或如何处理Unity Engine产生的力之前,我想在您的方法中强调一个问题。您可以根据位置计算方向,但位置是汽车的中心。因此,您无法从下面的图片中看到正确的方向:

enter image description here

您计算两个枢轴或中心点之间的方向,因此,您的力在左侧图像中有些倾斜。替代此方法,您可以使用ContactPoint,然后计算方向。

作为更详细的信息,以便OP可以理解我所说的内容!在上图中,您可以看到带有蓝色矩形的区域。您将使用Collision.contacts

获得对应区域的所有联系点。

enter image description here 然后像这样计算中心点或质心

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值,因此您得到一条蓝色的直线,而不是像第一个图像一样向左倾斜的箭头第二张图片的情况二。我希望我很清楚。