You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity2D角色跳跃异常:落地后无法立即再次跳跃问题求助

Unity平台游戏跳跃延迟问题修复

我是Unity新手,正在练习开发一款支持左右移动与跳跃的平台游戏。目前代码实现了角色仅在触地时可跳跃的功能,但存在一个问题:角色首次落地后需要等待一段时间才能再次跳跃,疑似函数更新频率不足。尝试添加布尔变量标记跳跃状态后仍未解决,相关代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour
{

    private Rigidbody2D rb;
    public float speed = 10f;
    public float jump = 20f;
    private Collider2D collide;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        collide = GetComponent<Collider2D>();
    }

    // Update is called once per frame
    void Update()
    {
        
        if(Input.GetKey(KeyCode.D))
        {
            rb.velocity = new Vector2(1 * speed, rb.velocity.y);
            transform.localScale = new Vector3(1, 1, 1);
        }
        if(Input.GetKey(KeyCode.A))
        {
            rb.velocity =new Vector2(-1 * speed, rb.velocity.y);
            transform.localScale = new Vector3(-1, 1, 1);
        }
        Jump();
    }

    private void OnCollisionStay2D(Collision2D collision)
    {
        if(collision.gameObject.tag == "Land")
        {
            Debug.Log("Touching Land");
            Jump();
        }
    }

    void Jump()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            rb.velocity = Vector2.up * jump;
        }
    }        
}

问题核心原因

  • 跳跃逻辑触发时机混乱:同时在Update和OnCollisionStay2D中调用Jump(),OnCollisionStay2D会在碰撞持续的每帧重复执行,而Input.GetKeyDown仅在按键按下的第一帧有效,重复检测导致输入响应延迟或失效。
  • 缺乏明确的地面状态标记,无法精准限制仅触地时触发跳跃。

修复方案

添加isGrounded布尔变量标记地面状态,仅在Update中处理跳跃输入;用OnCollisionEnter2D和OnCollisionExit2D替代OnCollisionStay2D,仅在碰撞开始/结束时更新地面状态,避免冗余调用。

修复后的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour
{
    private Rigidbody2D rb;
    public float speed = 10f;
    public float jumpForce = 20f;
    private Collider2D collider2D;
    // 标记角色是否处于地面
    private bool isGrounded;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        collider2D = GetComponent<Collider2D>();
        isGrounded = false;
    }

    void Update()
    {
        // 左右移动逻辑
        if (Input.GetKey(KeyCode.D))
        {
            rb.velocity = new Vector2(speed, rb.velocity.y);
            transform.localScale = new Vector3(1, 1, 1);
        }
        else if (Input.GetKey(KeyCode.A))
        {
            rb.velocity = new Vector2(-speed, rb.velocity.y);
            transform.localScale = new Vector3(-1, 1, 1);
        }
        else
        {
            // 松开方向键时停止水平移动,优化控制手感
            rb.velocity = new Vector2(0, rb.velocity.y);
        }

        // 仅在地面且按下W时触发跳跃
        if (Input.GetKeyDown(KeyCode.W) && isGrounded)
        {
            rb.velocity = Vector2.up * jumpForce;
            // 跳跃后立即标记为非地面,防止空中连跳
            isGrounded = false;
        }
    }

    // 接触地面时更新状态
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Land"))
        {
            isGrounded = true;
            Debug.Log("Touching Land");
        }
    }

    // 离开地面时更新状态
    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Land"))
        {
            isGrounded = false;
        }
    }
}

额外优化说明

  • 用CompareTag替代直接判断tag,性能更优且避免拼写错误。
  • 添加方向键松开后的停止逻辑,让角色移动控制更精准。
  • 跳跃后立即重置isGrounded,彻底避免空中连跳的可能。

内容的提问来源于stack exchange,提问作者ApGames

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:55:34