Godot中CharacterBody2D移动报错求助:move_in_slide相关问题
解决CharacterBody2D的move_and_slide()问题
你的代码里有几个明显问题导致move_and_slide()工作异常,下面逐个说明并给出修正方案:
1. 左右移动方向颠倒
当前代码中,按"left"时给motion.x = speed,这会让角色向右移动(Godot中x轴向右为正),正确逻辑应该是左移对应负x值,右移对应正x值。
2. 输入判断逻辑错误
你用了not Input.is_action_just_pressed("right")这类条件,is_action_just_pressed仅检测按键刚按下的那一帧,会导致同时按住左右键时逻辑混乱。应该直接用is_action_pressed判断持续按住的状态,无需排除刚按下的情况。
3. 重力未乘以delta
重力是加速度,必须乘以delta(帧间隔时间),否则角色下落速度会随游戏帧率波动,导致不同设备上运动效果不一致。
修正后的完整代码
extends CharacterBody2D var motion = Vector2(0, 0) const speed = 200 # 适当调高速度,默认50会过于缓慢 const gravity = 800 const UP = Vector2(0, -1) func _physics_process(delta): apply_gravity(delta) # 传递delta参数给重力函数 # 简化输入判断逻辑 motion.x = 0 if Input.is_action_pressed("left"): motion.x = -speed if Input.is_action_pressed("right"): motion.x = speed move_and_slide(motion, UP) func apply_gravity(delta): if is_on_floor(): motion.y = 0 else: motion.y += gravity * delta # 重力计算加入delta
额外说明
- 调高了
speed和gravity数值,让移动和下落手感更贴近常规2D游戏,你可以根据需求自行调整。 - 输入判断改为先重置x速度,再分别检测左右键,同时按住双方向时,后触发的方向会覆盖前一个,逻辑更直观。
move_and_slide()会自动处理碰撞后的速度衰减和地面贴合,无需手动额外处理x轴摩擦(如果需要更复杂的地面交互,可以用move_and_slide_with_snap或手动添加阻尼)。
内容的提问来源于stack exchange,提问作者Alejandro Obando
相关产品推荐
相关产品推荐

