我有以下代码,它在随机方向上向rigidbody2d添加力,并尝试在达到特定速度时将线性拖动设置为0,从而基本上让游戏对象慢慢飘走。
问题是拖拽似乎是直接设置为0,我不明白为什么,因此我无法解决问题
void Update () {
if (Input.GetKeyDown ("space")) {
rb.velocity = Vector3.zero;
Vector3 dir = Random.onUnitSphere;
rb.AddForce (dir * 10, ForceMode2D.Impulse);
}
if (rb.velocity.magnitude <= 1) {
rb.drag = 0;
}
}
谢谢 Crouz
答案 0 :(得分:2)
正如@Maakep所说,问题来自于你将 Rigidbody 速度设置为0
并且之后检查此速度是否为<= 1
(仅限力)稍后申请)。
要解决您的问题,您可以执行以下操作:
public bool applyNextFrame = false;
protected override void Update()
{
if(applyNextFrame && rb.velocity.magnitude <= 1)
{
rb.drag = 0;
applyNextFrame = false;
}
if(Input.GetKeyDown(KeyCode.Space))
{
rb.velocity = Vector3.zero;
Vector3 dir = Random.onUnitSphere;
rb.AddForce(dir * 10, ForceMode2D.Impulse);
applyNextFrame = true;
}
}
请记住,如果你的 Rigidbody 配置(质量,阻力和力)应用不同的速度值,这个解决方案远非完美无缺:因此,你赢了能够完全控制拖动何时达到0
(这可能完全是故意的,取决于您的项目!):)
您可以查看http://flask.pocoo.org/docs/0.12/api/#flask.Flask.teardown_request中的执行顺序图以获取更多信息:您可以在 Update()之前看到内部物理更新当您致电rb.AddForce(...)
时,它实际上仅在下一次内部物理更新期间应用。)
另请注意,我已将Input.GetKeyDown("space")
更改为Input.GetKeyDown(KeyCode.Space)
:如果您输错了space
,这可以避免拼写错误。
希望这有帮助,