Unity3d 在具有单位初始脉冲的抛物线路径上移动二维物理体

Unity3d 在具有单位初始脉冲的抛物线路径上移动二维物理体,unity3d,2d,physics,gravity,Unity3d,2d,Physics,Gravity,我所拥有的: 在Unity 5 2D中的一个抛射体,受重力的影响,我想以抛物线路径上的初始冲量从A点移动到B点 我所知道的: 随机起始位置的二维坐标(a) 随机目标位置的二维坐标(B) 我希望身体到达目标位置的时间(X) 我想知道的: 初始冲量(如unity applyforce和forcemode冲量中的冲量),我必须一次施加到身体上,以使它在X时间后达到所需的位置B 注意事项: 这是一个使用统一2D物理的2D世界 两个位置A和B完全是随机的,可能在相同的高度(y坐标),也可能不在相

我所拥有的:

在Unity 5 2D中的一个抛射体,受重力的影响,我想以抛物线路径上的初始冲量从A点移动到B点

我所知道的:

  • 随机起始位置的二维坐标(a)
  • 随机目标位置的二维坐标(B)
  • 我希望身体到达目标位置的时间(X)
我想知道的:

  • 初始冲量(如unity applyforce和forcemode冲量中的冲量),我必须一次施加到身体上,以使它在X时间后达到所需的位置B
注意事项:

  • 这是一个使用统一2D物理的2D世界
  • 两个位置A和B完全是随机的,可能在相同的高度(y坐标),也可能不在相同的高度
  • 我只想在产生射弹时施加一次脉冲
  • 除重力外,弹丸没有任何其他力影响他(对于当前问题,假设它总是指向下方的9.8级)
这是我想要的(糟糕的)图纸:D


谢谢大家

仅受重力影响的弹丸位置公式如下:

x = x0 + v_x0*t
y = y0 + v_y0*t + 0.5*g*t^2
因此,通过一些基本计算,了解起动速度:

v_x0 = (x-x0)/t
v_y0 = (y-y0)/t + 0.5*g*t^2/t = (y-y0)/t - 4.9*t
现在,为了通过使用
AddForce
添加此起始速度,我们可以使用
ForceMode.VelocityChange
,但此模式仅适用于三维刚体,因此我们需要使用
ForceMode.pulse
并将力乘以物体的质量:

RigidBody2D rigid = GetComponent<RigidBody2D>();
rigid.AddForce(new Vector2 (v_x0, v_y0) * rigid.mass, ForceMode2D.Impulse);
RigidBody2D刚性=GetComponent();
刚性。附加力(新矢量2(v_x0,v_y0)*刚性。质量,力模式2D。脉冲);
就这样


当然,您可以直接设置刚体的速度,而不是使用
AddForce

让我们解决几个简单的问题。我们的目标是找到粒子的初始速度,而不是“脉冲”,因为这样我们可以实现更好的控制

首先,考虑我们如何在没有统一物理的情况下解决这个问题。作为时间函数的粒子位置取决于其初始位置、速度和加速度。无论有多少个维度,相同的方程式都适用。这个方程式是:

当前位置=1/2*加速度*时间^2+速度*时间+起始位置

当前位置
成为我们想要的目的地,
时间
成为您选择的旅行持续时间,
起始位置
成为粒子的起始位置

在x维中,没有加速度。让
X_0
成为我们的起点X位置,
X_1
成为我们的目的地,
T
成为我们到达目的地所需的时间。我们想要找到v_x,或者x维的速度。为了便于解释,我将所有常量标记为大写,变量标记为小写

  • X_1=v_X*T+X_0
  • v_x=(x_1-x_0)/T
  • 在y维中,我们有某种重力。让我们把它作为我们的加速度:

  • Y_1=0.5*G*T*T+v_Y*T+Y_0
  • v_y=(y_1-y_0-0.5*G*T*T)/T
  • 现在您有了
    v_x
    v_y
    ,只需设置速度:

    rigidbody2d.velocity = new Vector2(v_x, v_y);
    
    由于不同的物体具有不同的质量,所以您不想尝试计算冲量。生成对象时,只需将速度设置为帧中所需的速度

    这与您在互联网上其他地方可能找到的建议相反,但在做更复杂的事情之前,请先尝试一下

    一些重要注意事项:

    • Unity中的物理处理并不稳定:在不同的平台上,尤其是在不同的移动设备之间,可能会得到不同的结果。如果存在性能压力,物理评估可能会减少,因此结果可能不正确。这通常不是2D物理的问题
    • 根据您的版本和其他设置,您可能会遇到重力比例问题