如何平滑(减慢)Unity2D 中的飞机加速?
How to smooth (slow down) aircraft acceleration in Unity2D?
我在 Unity 论坛上问过这个问题,但他们的人数似乎比 SO 少得多,而且我没有得到可接受的答案。问题如下:在我的游戏(用Unity,C#制作)中,我使用物理(Rigidbody2D)和addForce来加速飞机。所加的力与推力成正比。
问题是:如果我增加很大的力,我会以不切实际的速度快速达到现实的高速。如果我添加较少的力,我会有逼真的加速度,但蜗牛的最高速度。我试着玩弄阻力,但等式本身就平衡了:两倍的力和两倍的阻力产生相同的加速度和最高速度。增加质量会减慢加速度,但会按比例降低最大速度。
我现在正在做的是根据玩家的速度制定几个阻力方程,以将加速度限制在可管理的水平,但感觉非常笨拙(更不用说不直观和不切实际了)。
这是我的代码片段:
//////////////////Adding thrust/////////////////////////////
rb.AddForce(transform.right*thrust); //thrust goes from 0 to 100
//////////////////Drag equations/////////////////////////////
if (rb.velocity.magnitude <= 3)
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 8f + 4f, 2.1f, 4f);
else if (rb.velocity.magnitude <= 4)
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 4.9f + 4f, 2.1f, 4f);
else if (rb.velocity.magnitude <= 7)
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 2.9f + 4.15f, 1.1f, 4f);
else if (rb.velocity.magnitude <= 10)
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 5f + 3.2f, 1f, 4f);
else
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 18f + 1.7f, 0.8f, 4f);
从单位到km/h的速度换算如下:
speedText.text = "Speed: " + Mathf.Round(rb.velocity.magnitude * 50 * 3.6f) + "km/h";
所以 7 的 rb.velocity.magnitude 是 1260 km/h。
如果没有我的阻力方程,飞行器要么几乎立即提升到 2500km/h,要么缓慢加速到 500km/h 并保持在那里。我错过了什么吗?怎样才能做到极速高而加速慢?
提前致谢。
多亏了 meepzh 的想法,我找到了一个可行的解决方案:我找到了一个 "sigmoid" 函数,下面是对我来说效果很好的方程式:6/(1+e^(0.18(x-0.5)))+0.35.
我在 Unity 论坛上问过这个问题,但他们的人数似乎比 SO 少得多,而且我没有得到可接受的答案。问题如下:在我的游戏(用Unity,C#制作)中,我使用物理(Rigidbody2D)和addForce来加速飞机。所加的力与推力成正比。
问题是:如果我增加很大的力,我会以不切实际的速度快速达到现实的高速。如果我添加较少的力,我会有逼真的加速度,但蜗牛的最高速度。我试着玩弄阻力,但等式本身就平衡了:两倍的力和两倍的阻力产生相同的加速度和最高速度。增加质量会减慢加速度,但会按比例降低最大速度。
我现在正在做的是根据玩家的速度制定几个阻力方程,以将加速度限制在可管理的水平,但感觉非常笨拙(更不用说不直观和不切实际了)。
这是我的代码片段:
//////////////////Adding thrust/////////////////////////////
rb.AddForce(transform.right*thrust); //thrust goes from 0 to 100
//////////////////Drag equations/////////////////////////////
if (rb.velocity.magnitude <= 3)
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 8f + 4f, 2.1f, 4f);
else if (rb.velocity.magnitude <= 4)
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 4.9f + 4f, 2.1f, 4f);
else if (rb.velocity.magnitude <= 7)
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 2.9f + 4.15f, 1.1f, 4f);
else if (rb.velocity.magnitude <= 10)
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 5f + 3.2f, 1f, 4f);
else
rb.drag = Mathf.Clamp(-rb.velocity.magnitude / 18f + 1.7f, 0.8f, 4f);
从单位到km/h的速度换算如下:
speedText.text = "Speed: " + Mathf.Round(rb.velocity.magnitude * 50 * 3.6f) + "km/h";
所以 7 的 rb.velocity.magnitude 是 1260 km/h。
如果没有我的阻力方程,飞行器要么几乎立即提升到 2500km/h,要么缓慢加速到 500km/h 并保持在那里。我错过了什么吗?怎样才能做到极速高而加速慢?
提前致谢。
多亏了 meepzh 的想法,我找到了一个可行的解决方案:我找到了一个 "sigmoid" 函数,下面是对我来说效果很好的方程式:6/(1+e^(0.18(x-0.5)))+0.35.