Godot引擎CharacterBody2D二段跳功能异常问题求助
二段跳功能修复方案
核心问题定位
- 跳跃次数重置时机错误:原代码在角色离开地面(
!IsOnFloor())时将jumpmax重置为0,导致每帧都会重置跳跃计数,永远满足jumpmax < 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
相关产品推荐
相关产品推荐

