我在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直接给我奇怪的结果所以我不知道该怎么做。下面是我想要的一个例子,以及为什么它没有清理(向量没有正确绘制但我希望它有意义)。
我尝试过使用以下代码:
float magnitude = rigidbody2D.velocity.magnitude;
rigidbody2D.velocity = transform.up * magnitude;
这使得这艘船像我想要的那样飞行,但显然它也可以解决碰撞力,所以我回到了零。欢迎任何帮助/想法,因为我对此非常感兴趣。
谢谢你 索伦
答案 0 :(得分:2)
实现这一目标很容易:
你真的只是试图"反弹" (也就是说"左右和#34; .."后退和前进")继续向上发展。
Unity中最简单的方法是 - 只是让碰撞器触发,实际上不使用PhysX碰撞。在每次碰撞时,在相关方向,左侧或右侧(可能有一点上下方差)施加一个力(Unity' s"爆炸力"将会很好)。
享受!