【发布时间】:2016-06-27 21:55:03
【问题描述】:
我在 Unity 论坛上提出了这个问题,但他们的人数似乎比 SO 少得多,而且我没有得到可接受的答案。问题如下:在我的游戏(Unity,C#制作)中,我使用物理(Rigidbody2D)和addForce来加速飞机。增加的力与推力成正比。
问题是:如果我增加了很多力量,我会以不切实际的速度快速达到现实的高速。如果我增加较少的力,我会有真实的加速度,但蜗牛的最高速度。我试着玩阻力,但等式自己平衡了:减少两倍的力和减少两倍的阻力会产生相同的加速度和最高速度。增加质量会减慢加速度,但会成比例地降低最大速度。
我现在所做的是根据玩家的速度制定几个阻力方程,以将加速度限制在可管理的水平,但感觉非常笨拙(更不用说不直观和不切实际)。
这是我的代码的 sn-ps:
//////////////////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 公里/小时。
没有我的阻力方程,飞行器要么几乎立即加速到 2500 公里/小时,要么缓慢加速到 500 公里/小时并保持在那里。我错过了什么吗?我怎样才能有高的最高速度和慢的加速?
提前谢谢你。
【问题讨论】:
-
我认为后一种选择(“缓慢加速到 500 公里/小时并停留在那里”)是您想要的,但这是调整值的问题。如果您想避免使用 if 语句,请尝试使用不同的方程式来乘以阻力或速度。例如,i.imgur.com/FACzbsQ.png。您也可以使用
log()和sqrt(),但它们很慢。祝你好运! -
哇,伙计,你的想法完全奏效了!太感谢了!所以,你说我的阻力方程想法总体上是正确的,并提供了一个很好的启动函数。但它并不完美,所以我搜索了“S形函数”,发现了一个“sigmoid”函数,这对于这种情况来说绝对是完美的!经过一个小时左右的修修补补,我发现这个形状对我很有用(也许它会帮助有类似问题的人):6/(1+e^(0.18(x-0.5)))+0.35。
-
太棒了,我很高兴它成功了!感谢您分享方程式,我得自己研究一下哈哈
-
@flanker37 你应该添加你的方程式作为答案并接受它,这样人们会更容易看到你找到了解决方案。