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

Unity 2D中Input.GetKeyDown实现方块跳跃无效问题咨询

Unity 2D方块跳跃问题解决方案

问题1:Input.GetKeyDown触发但方块不跳跃

你在使用ForceMode2D.Impulse模式添加力时,错误地乘以了Time.deltaTime。Impulse是瞬间冲量,不需要和时间增量相乘——这个操作会把跳跃力缩小到几乎可以忽略的程度,导致方块没有反应。

问题2:Input.GetKey导致长按空格持续上升

这是因为没有限制跳跃触发条件,只要按住空格就会持续施加力。解决核心是添加地面检测,只有当方块接触地面时才能触发跳跃。

修正后的完整代码

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

public class Movement : MonoBehaviour
{
    public float moveSpeed;
    public float jumpSpeed;
    // 地面检测相关
    public Transform groundCheck; // 拖入方块底部的空物体作为检测点
    public LayerMask groundLayer; // 选择地面所在的Layer
    private bool isGrounded;

    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 检测是否接触地面
        isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.1f, groundLayer);
        MoveHorizontally();
        Jump();
    }

    void MoveHorizontally()
    {
        float moveX = Input.GetAxis("Horizontal") * moveSpeed;
        // 使用Rigidbody2D控制移动,符合物理规则
        rb.velocity = new Vector2(moveX, rb.velocity.y);
    }

    void Jump()
    {
        // 仅在地面且按下空格瞬间触发跳跃
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            // 移除Time.deltaTime,Impulse模式不需要
            rb.AddForce(new Vector2(0, jumpSpeed), ForceMode2D.Impulse);
            Debug.Log("Jumped!");
        }
    }
}

额外设置步骤

  1. 在方块底部创建一个空物体,将其拖入脚本的groundCheck字段,作为地面检测的触发点。
  2. 给地面对象设置专属Layer(比如命名为Ground),然后在脚本的groundLayer下拉菜单中选择该Layer。

优化说明

  • 替换直接修改transform.position的移动方式为Rigidbody2D.velocity,避免移动时忽略物理碰撞(比如穿墙)。
  • 地面检测用OverlapCircle可以灵活调整检测范围,确保只有方块真正接触地面时才能跳跃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:41:29