游戏中的跳跃,就是以某一个速度起跳,克服重力。而以不同的速度,起跳的最高点是不一样的,很难去量化,所以我们可以定义每次起跳的最大高度,然后求出起跳速度,即可做到一切可控。

自由落体公式 $h = \frac{1}{2}gt^2$。速度 $v = gt$,这个是瞬时速度,但是自由落体的速度是均匀变化的,所以平均速度就是下落高度中间时刻的速度,所以才得出 $h = \frac{1}{2}gt^2$。

我们的目标是求出跳跃的速度。

首先,假设我们以一个初始速度 $j$ 来跳跃,这个是一个向上的速度,但是因为重力的存在,所以我们的跳跃速度会因为重力的向下抵消,而逐渐趋向于 0。当 $j$ 慢慢被抵消到 0 时,我们也就达到了以 $j$ 这个速度来跳跃所能到达的最大高度。

对于任意时刻 $t$,速度 $v = j - gt$,当 $j - gt = 0$ 时,也就是我们所能到达的最大高度。所以,到达最大高度的时间为 $t = \frac{j}{g}$。

根据上面的公式,我们可以知道,在以 $j$ 来跳跃的整个过程中,任意时刻的高度为 $h = jt - \frac{gt^2}{2}$。

由于我们上面已经知道了,在 $t = \frac{j}{g}$ 时,我们将达到最大跳跃高度。将 $\frac{j}{g}$ 带入到任意时刻的高度公式中 $h = jt - \frac{gt^2}{2}$。我们可以得到 $h = j(\frac{j}{g}) - \frac{g(\frac{j}{g})^2}{2}$。

化简上面的公式将得到 $h = \frac{j^2}{g} - \frac{\frac{j^2}{g}}{2} = \frac{j^2}{g} - \frac{j^2}{2g} = \frac{j^2}{2g}$。

也就是说,最高点 $h = \frac{j^2}{2g}$。假设最大高速度 $h$ 是我们预先设定的,也就是 $h$ 已知,就可以求出以多大的速度 $j$ 起跳,能达到最大预设高度 $h$。

根据上面的公式可知 $j^2 = 2gh$,也就是 $j = \sqrt{2gh}$。假设重力向下的,所以我们这里需要加上一个负号,也就是 $j = \sqrt{-2gh}$

综上,在游戏中假设我们设定好每次跳跃的最大高度,根据上面的公式,即可知道跳跃速度是多少。

对于 Unity 中使用 Rigidbody 来控制运动,在触发跳跃时,只要设定它的 velocity.y += Mathf.Sqrt(-2f * Physics.gravity.y * maxJumpHeight) 即可。其中 maxJumpHeight 为每次跳跃我们期望的最大高度。

如果不使用 Rigidbody,也可以自己每帧模拟重力,就是一个向下的向量。以上原理都是通用的,不限于引擎。