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

Unity单次跳跃触发后锁定问题求助:代码排查与修复支持

解决跳跃只能触发一次的问题

嘿,我一眼就发现问题所在啦!你把Unity的碰撞回调函数OnCollisionEnter直接嵌套在Update方法里面了——Unity的回调函数必须是类的顶级方法,嵌套在其他函数里的话,引擎根本不会识别和调用它。这就导致你落地后,isGrounded永远不会被重置为true,自然没法再次触发跳跃。

具体修正步骤:

  • 把碰撞回调从Update中移出,作为脚本类的独立方法
  • 因为你用的是Rigidbody2D(2D刚体),对应的碰撞回调应该用OnCollisionEnter2D,而不是3D的OnCollisionEnter
  • 额外优化:缓存刚体组件、用CompareTag替代直接字符串比较,提升性能和可靠性

修正后的完整代码:

private Rigidbody2D rb;
public float speed;
public float jumpVelocity;
private bool isGrounded;

// Start在第一帧更新前调用
void Start() {
    // 缓存Rigidbody2D组件,避免重复GetComponent开销
    rb = GetComponent<Rigidbody2D>();
}

// Update每帧调用一次
void Update() {
    Vector3 v = transform.position;
    v.x += speed * Input.GetAxis("Horizontal") * Time.deltaTime;
    v.z += speed * Input.GetAxis("Vertical") * Time.deltaTime;
    transform.position = v;

    if (Input.GetKeyDown(KeyCode.Space) && isGrounded) {
        rb.velocity = Vector2.up * jumpVelocity;
        isGrounded = false;
    }
}

// 2D碰撞进入回调,独立于Update方法
void OnCollisionEnter2D(Collision2D col) {
    // 用CompareTag比直接==更高效,且能在标签不存在时给出警告
    if (col.gameObject.CompareTag("Ground") && !isGrounded) {
        isGrounded = true;
    }
}

额外提示:

  • 确保你的地面对象确实添加了Ground标签,并且碰撞体组件(比如BoxCollider2D)的Is Trigger没有勾选(如果用触发检测落地的话,要改用OnTriggerEnter2D)
  • 如果角色有多个碰撞体,可以通过col.contacts判断碰撞的具体部位,让落地检测更精准

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:32:38