【发布时间】:2014-07-11 11:39:19
【问题描述】:
我在 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;
}
所以有了这个我得到了我想要的反弹效果,但显然船现在大部分时间都是侧向飞行的,因为力没有直接转化为船的速度,直接操纵rigidbody2D.velocity 给了我奇怪的结果,所以我不知道该怎么做。这是我想要的说明以及为什么它无法清除问题(矢量未正确绘制,但我希望它仍然有意义)。
我已尝试使用以下代码:
float magnitude = rigidbody2D.velocity.magnitude;
rigidbody2D.velocity = transform.up * magnitude;
这使船按照我的意愿飞行,但显然它也消除了碰撞力,所以我回到了零方格。欢迎任何帮助/想法,因为我对此非常坚持。
谢谢
索伦
【问题讨论】:
-
你描述的情况在物理上是不可能的。每个动作都有一个相等和相反的反应。我想你可以给你的船一个巨大的质量,这样碰撞对它的明显影响就会最小化。
-
我担心这在物理上是不可能的。给我的船一个巨大的质量不会解决任何问题,因为我希望碰撞产生影响,我只想将它与我的船的非物理运动结合起来。我想如果我想让它起作用,我必须实现自己的假物理。
-
嗯,碰撞会产生影响,一个物体的质量越大,对另一个物体的影响就越大。你必须做的是执行两个计算。一个用于计算对您的船的旋转速度的影响,另一个用于计算对小行星的影响。物理学崩溃的地方是小行星和船的运动定律会有所不同。也许这个老游戏可能会引发一个想法。 youtube.com/watch?v=HlPgB9rEkBg :)
标签: unity3d game-physics physics-engine