统一。修复了更新无法很好地感知我的跳转输入。正常更新在按下空格时将我的角色发射到随机高度



我不知道发生了什么。我通常在更新功能上跳一跳。这是我的第一个大游戏,尽管除了其他原型或我做过的糟糕的游戏尝试。

这是我的跳转代码

void FixedUpdate()
{
if (isDead == false)
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (OnGround == true)
{
rb.velocity=  new Vector2 (rb.velocity.x, jumpforce * Time.deltaTime);
}
}
} 
}

我有时会错过一些固定更新的跳跃。但当我把它放在更新功能中时,它有时会跳得很低,比如两三次,然后它会把我跳得很高。这太随意和怪异了。对此我能做些什么吗?还是我只能处理固定日期?如果重要的话,我甚至试着更新。

一般经验法则是将所有键盘/鼠标输入放入Update方法,而不是FixedUpdate方法。这是因为FixedUpdate不是逐帧处理,而是以固定的时间增量调用的,该时间增量可以是在特定帧周期内或多或少的调用。

输入数据是每帧确定的,因此在FixedUpdate中,它可以在帧之间运行、跳过帧等。您可能会丢失输入。相反,将您的输入代码移动到Update方法,该方法在每帧调用一次。您将不再丢失输入。

Update中设置物理调用的问题是因为所有物理代码都应该放在FixedUpdate中。由于Update的运行速度可能比游戏中的物理系统更快或更慢,因此在其中进行基于物理的调用可能会产生意想不到的结果。

Unity:

处理刚体时,应使用FixedUpdate而不是Update。例如,当向刚体添加力时,必须在FixedUpdate中的每个固定帧而不是在Update中的每一帧应用力。告诉我更多。。。

解决方案是缓存来自Update的输入,然后在FixedUpdate中使用此方法的结果输入进行设置,以确定您的物理特性。

private bool justJumped = false;
void FixedUpdate()
{
if(justJumped)
{
justJumped = false;
rb.AddForce(Vector2.up * jumpForce);
}
}
void Update()
{
if (!justJumped && Input.GetKeyDown(KeyCode.Space) && OnGround && !isDead)
{
justJumped = true;
}
}

我还建议不要直接设置速度,因为任何其他外力都会作用在你的球员身上,它们会被忽略。相反,请使用AddForce。我把你的直接速度设定换成了AddForce。我也不会乘以Time.deltaTime。该值只是一个浮点值,表示自上一帧以来经过的时间。它应该在以小增量进行移动时使用,例如使用Lerp。如果您想直接设置速度,请删除Time.deltaTime产品并将jumpforce减少很多。你会发现结果是一样的。

最新更新