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

Unity 2D双跳功能实现遇逻辑错误,求排查解决

双跳功能逻辑问题分析与修复

原代码核心逻辑问题

  • 错误用Input.GetKey(持续按住触发)替代Input.GetKeyDown(单次按下触发)计数,按住W时jumpCount会疯狂累加,完全失控
  • 落地时仅重置grounded但未重置jumpCount,导致落地后可能无法触发第一次跳跃
  • 双跳条件拆分零散,分支互相干扰,比如jumpCount>2时强制重置状态的逻辑会打乱正常跳跃流程
  • 第一次跳跃额外限制jumpCount == 0,落地后若没重置计数,这个条件永远不满足

修复后的代码

using UnityEngine;

public class movementscript : MonoBehaviour
{
    public Rigidbody2D mybody;
    public bool grounded = false;
    // 最大跳跃次数,双跳设为2
    public int maxJumpCount = 2;
    private int currentJumpCount;

    void Start()
    {
        // 初始化时给满跳跃次数
        currentJumpCount = maxJumpCount;
    }

    void Update()
    {
        // 只在单次按下W时触发跳跃判断
        if (Input.GetKeyDown(KeyCode.W))
        {
            // 在地面时,直接跳并重置剩余跳跃次数
            if (grounded)
            {
                Jump();
                currentJumpCount = maxJumpCount - 1;
                grounded = false;
            }
            // 不在地面但还有剩余次数时,触发双跳
            else if (currentJumpCount > 0)
            {
                Jump();
                currentJumpCount--;
            }
        }
    }

    // 把跳跃逻辑封装成方法,避免重复代码
    private void Jump()
    {
        // 保留X轴原有速度,只修改Y轴,避免跳跃时横向移动中断
        mybody.velocity = new Vector2(mybody.velocity.x, 10f);
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        // 落地同时重置地面状态和跳跃次数
        grounded = true;
        currentJumpCount = maxJumpCount;
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        grounded = false;
    }
}

关键逻辑说明

  • 用currentJumpCount记录剩余跳跃次数,maxJumpCount设为2对应双跳需求,初始化时给满次数
  • 统一用Input.GetKeyDown确保每次按下W只触发一次判断,彻底解决计数失控问题
  • 落地时同时重置grounded和currentJumpCount,保证回到地面后可以重新触发两次跳跃
  • 封装Jump()方法减少冗余,同时保留横向移动速度,更符合正常操作逻辑
  • 跳跃时单独修改Y轴速度,避免覆盖X轴的移动状态,让跳跃和横向移动可以同时进行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:12:45