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

Joh*_*ohn 4 c# unity-game-engine

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

这是我的跳转代码

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

我有时会错过固定更新的一些跳转。但是当我将它放入更新功能时,它有时会跳得很低,比如两到三次,然后它又把我跳得很高。这实在是太随机和奇怪了。我能对此做些什么吗?或者我只需要处理fixedupdate?如果这很重要的话,我什至尝试了 LateUpdate 。

use*_*449 6

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

输入数据是每帧确定的,因此在FixedUpdate它可以在帧之间运行、跳帧等的地方,您有可能丢失输入。相反,将输入代码移至Update每帧调用的方法。您将不再丢失输入。

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

统一:

处理 Rigidbody 时应使用 FixUpdate 而不是 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的答案。我希望你不介意,但我添加了 Unity 的“FixedUpdate”引用。+1 (2认同)
  • @MickyD 一点也不介意。绝对会给答案带来一些权威和进一步的清晰度。 (2认同)