C# 团结。修复了更新isn';我感觉不到我的跳转输入。按空格键时,“正常更新”会将我的角色启动到随机高度

C# 团结。修复了更新isn';我感觉不到我的跳转输入。按空格键时,“正常更新”会将我的角色启动到随机高度,c#,unity3d,C#,Unity3d,我不知道怎么了。我通常在更新功能上跳转。这是我的第一个大型游戏,除了我做过的其他原型或糟糕的游戏尝试之外 这是我的跳转代码 void FixedUpdate() { if (isDead == false) { if (Input.GetKeyDown(KeyCode.Space)) { if (OnGround == true) { rb.velocity= new

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

这是我的跳转代码

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

我有时会错过一些固定更新的跳跃。但当我把它放在我的更新函数中时,它有时跳得很低,比如两到三次,然后它把我推得很高。这是如此随机和怪异。对此我能做些什么,还是只需要处理FixeUpdate?如果有必要,我甚至尝试了lateupdate。

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

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

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

团结:

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

解决方案是缓存
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
替换了您的直接速度设置。我也不会乘以
Time.deltaTime
。该值只是自上一帧以来经过的时间的浮点值。当以小增量进行移动时,如使用
Lerp
时,应使用该选项。如果您想直接设置速度,请删除
Time.deltaTime
产品,并将
跳跃力减少很多。你会发现结果是一样的。

回答得不错。我希望你不介意,但我添加了Unity re
FixedUpdate
的一句话+1@MickyD别介意。肯定会给答案带来一些权威和进一步的清晰。嘿,约翰!我注意到你对StackOverflow有点陌生,我只是想解释一下论坛是如何运作的。我注意到你有,这很好,因为这就是StackOverflow的目的,但是你从来没有接受过任何问题的答案。如果您觉得其他用户的帖子解决了您的任何问题,您可以单击该帖子左侧的绿色复选标记来关闭该问题。它让任何其他人在将来偶然发现你的问题时都知道它已经有了答案并且解决了。谢谢你的帮助!很抱歉没有这样做,这可能会对其他人很有帮助。不必担心,我只是想让你知道你是该平台的新手。不是每个人都知道它是如何工作的。