弹丸未正确继承父速度(Unity3D)

时间:2018-08-16 14:25:12

标签: c# unity3d game-physics

我正试图从高速移动的玩家身上发射弹丸。问题是子弹似乎没有继承角速度。如果玩家以500 U / s的速度直线移动,则子弹正确地继承了该速度,并在其上增加了自己的速度:

GameObject bullet = Instantiate(projectile, gun.transform.position, gun.transform.rotation);
bullet.GetComponent<Rigidbody>().velocity = r.velocity + bullet.transform.forward *bulletSpeed;

但是,如果玩家转弯真的很快,它不会继承旋转速度,并且子弹看起来像是转向侧面。

我该如何实现?我尝试将播放器的角速度分配给子弹,但这只是导致子弹在向同一方向移动时旋转。

一些额外的细节:

  • 我正在使用僵尸.MoveRotation()旋转播放器,但是我手动计算了angularVelocity并将其分配给子弹

  • 我尝试使用AddTorque()移动播放器,但用子弹无法产生任何结果

1 个答案:

答案 0 :(得分:3)

直接的问题是,在创建和发射射弹之前,射弹才是物理模拟的一部分,这意味着玩家到该点的旋转将无法影响其运动。我想,如果您一开始就创建了弹丸,然后用弱的接头将其附着在枪上,然后在发射时将其折断并增加其速度,那么这样做可能会奏效-但是,如果您只是“伪造”的话,这确实会更简单它。

应用圆周运动

这类似于您在物理学教科书中找到的经典圆周运动示例。当子弹在玩家周围(枪内)绕圈移动时,其正常路径(如果释放)将与玩家周围的圆形路径相切。因此,当发射子弹(并因此从圆形路径释放)时,玩家的角速度将转换为子弹的线速度。这是我整理的一个简单图表,用圆球上的球旋转成圆圈来表示情况:

enter image description here

获取子弹的切向速度

发射后,您不想对射弹施加任何类型的角速度-如您所见,这只会使射弹沿其自身轴旋转。相反,您想对射弹施加一个附加的速度矢量,该速度矢量与玩家的旋转方向相切(并垂直于子弹的表面)。那么我们该怎么做呢?

好吧,根据this website,绕圆旋转的物体在任意点处的切线速度公式为:

  

速度=角速度x半径

要记住的关键点是angularVelocity以弧度而不是度为单位。

因此,让我们将所有这些放在一起。这是您如何编写此代码的一般思路:

FireGun() {
    // Assumes the current class has access to the rotation rate of the player
    float bulletAngularVelocityRad = Mathf.Deg2Rad(rotationRateDegrees)

    // The radius of the circular motion is the distance between the bullet
    // spawn point and the player's axis of rotation
    float bulletRotationRadius =
        (r.transform.position - gun.transform.position).magnitude;

    GameObject bullet =
        Instantiate(projectile, gun.transform.position, gun.transform.rotation);

    // You may need to reverse the sign here, since bullet.transform.right
    // may be opposite of the rotation
    Vector3 bulletTangentialVelocity =
        bulletAngularVelocityRad * bulletRotationRadius * bullet.transform.right;

    // Now we can just add on bulletTangentialVelocity as a component
    // vector to the velocity
    bullet.GetComponent<Rigidbody>().velocity =
        r.velocity + bullet.transform.forward * bulletSpeed + bulletTangentialVelocity;
}

希望这会有所帮助!在研究游戏物理学时,阅读一些基本的运动学/力学绝不是一个坏主意,因为有时依赖于游戏物理学实际上比仅仅设计自己的解决方案还要复杂。