为2D体增加力,同时确保速度始终朝向身体向上的方向

时间:2014-07-11 11:39:20

标签: unity3d game-physics physics-engine

我在Unity 3D中进行此操作(在2D模式下),因此我的代码示例将在Unity / C#中,但我认为这更像是一般物理问题。

我有一个飞行的2D宇宙飞船,它偶尔遇到一些小行星(或其他船只),我实现这个的方法是将用户输入转换为这样的2D矢量:

Vector2 movement = new Vector2(0, currentPlayerSpeed);

“currentPlayerSpeed”是根据船舶最大速度计算出来的,并随着时间的推移加入加速度,然后我将这个Vector2D添加到这样的Update方法中的船舶变换(船舶总是相对于它自己“向上”飞行旋转):

transform.Translate(movement);

我根据输入旋转了船(并添加了一些最大旋转力)并且我直接旋转船而不是通过物理体(我通过transform.Rotate (rotationVector)设置)并且船总是朝着方向飞行当前速度的“向上”,这意味着它甚至不会飞到最远的地方。这是我希望它工作的方式,但是...我也希望这艘船可以反弹任何小行星(或其他船只),我想在物理上使用物理构建,但我不知道如何正确施加力,使我保持正确的速度/方向。

我已将我的更新转换为FixedUpdate,现在我这样做是为了移动船只:

rigidbody2D.AddForce (transform.up * currentPlayerSpeed);
if(rigidbody2D.velocity.magnitude > maxShipSpeed)
{
    rigidbody2D.velocity = rigidbody2D.velocity.normalized * maxShipSpeed;
}

所以有了这个,我得到了我想要的反弹效果,但显然船现在大部分时间都是横向飞行,因为力量没有直接转换为船速并且操纵刚体2D.velocity直接给我奇怪的结果所以我不知道该怎么做。下面是我想要的一个例子,以及为什么它没有清​​理(向量没有正确绘制但我希望它有意义)。

enter image description here

我尝试过使用以下代码:

float magnitude = rigidbody2D.velocity.magnitude;
rigidbody2D.velocity = transform.up * magnitude;

这使得这艘船像我想要的那样飞行,但显然它也可以解决碰撞力,所以我回到了零。欢迎任何帮助/想法,因为我对此非常感兴趣。

谢谢你 索伦

1 个答案:

答案 0 :(得分:2)

实现这一目标很容易:

你真的只是试图"反弹" (也就是说"左右和#34; .."后退和前进")继续向上发展。

Unity中最简单的方法是 - 只是让碰撞器触发,实际上不使用PhysX碰撞。在每次碰撞时,在相关方向,左侧或右侧(可能有一点上下方差)施加一个力(Unity' s"爆炸力"将会很好)。

享受!