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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:40:14