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

Godot引擎CharacterBody2D二段跳功能异常问题求助

二段跳功能修复方案

核心问题定位

  1. 跳跃次数重置时机错误:原代码在角色离开地面(!IsOnFloor())时将jumpmax重置为0,导致每帧都会重置跳跃计数,永远满足jumpmax < 2的条件,进而允许无限跳跃。
  2. 逻辑运算符使用错误:使用了位运算符号&而非逻辑与&&,虽不直接导致无限跳跃,但不符合代码语义规范。

修正后的完整代码

using Godot;
using System;

public partial class CharacterBody2D : Godot.CharacterBody2D
{
    public const float Speed = 300.0f;
    public const float JumpVelocity = -400.0f;
    int jumpmax = 0;

    public float gravity = ProjectSettings.GetSetting("physics/2d/default_gravity").AsSingle();

    public override void _PhysicsProcess(double delta)
    {
        Vector2 velocity = Velocity;

        // 回到地面时重置跳跃次数,这是二段跳逻辑的核心
        if (IsOnFloor())
        {
            jumpmax = 0;
        }

        // 仅在空中时应用重力
        if (!IsOnFloor())
        {
            velocity.Y += gravity * (float)delta;
        }

        // 处理跳跃:仅当按下跳跃键且未达最大跳跃次数时触发
        if (Input.IsActionJustPressed("ui_accept") && jumpmax < 2)
        {
            jumpmax++;
            velocity.Y = JumpVelocity;
            GD.Print(jumpmax);
        }

        // 处理水平移动
        Vector2 direction = Input.GetVector("ui_left", "ui_right", "ui_up", "ui_down");
        if (direction != Vector2.Zero)
        {
            velocity.X = direction.X * Speed;
        }
        else
        {
            velocity.X = Mathf.MoveToward(Velocity.X, 0, Speed);
        }

        Velocity = velocity;
        MoveAndSlide();
    }
}

逻辑说明

  • 当角色站在地面(IsOnFloor()返回true)时,重置jumpmax为0,确保每次落地后都能重新获得两次跳跃机会。
  • 空中阶段仅应用重力,不再重置跳跃计数,这样第一次跳跃后jumpmax变为1,第二次变为2,此时jumpmax < 2不成立,无法触发第三次跳跃。
  • 使用&&逻辑与运算符,保证只有两个条件同时满足时才执行跳跃逻辑,符合代码语义且避免不必要的计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:31:02