我有什么:
Unity 5 2D中受弹力影响的射弹,我想从A点移动到B点,在抛物线路径上有初始冲动
我所知道的:
我想知道的事情:
备注:
先谢谢你们!
答案 0 :(得分:4)
让我们解决一些更简单的问题。我们的目标是找到粒子的初始速度,而不是“冲动”,因为我们将通过这种方式实现更好的控制。
首先,考虑如何在没有Unity物理的情况下解决这个问题。粒子作为时间函数的位置取决于其初始位置,速度和加速度。无论您有多少维度,相同的公式都适用。这个等式是:
current_position = 1/2 * acceleration * time^2 + velocity * time + starting_position
让current_position
成为我们想要的目的地,time
是您选择的旅行时长,starting_position
是粒子的起始位置。
在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);
由于不同的物体具有不同的质量,因此您不想尝试计算冲动。只需在生成对象时将速度设置为帧中所需的速度。
这与您在互联网上可能找到的建议相反,但先尝试,然后再做更复杂的事情。
一些重要的注释:
答案 1 :(得分:3)
仅受重力影响的抛射物位置公式如下:
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
,但此模式仅适用于3D刚体,因此我们需要使用{{1}并将力乘以物体的质量:
ForceMode.Impulse
就是这样。
当然,您可以直接设置刚体的速度,而不是使用RigidBody2D rigid = GetComponent<RigidBody2D>();
rigid.AddForce(new Vector2 (v_x0, v_y0) * rigid.mass, ForceMode2D.Impulse);
。