用途:在 Godot 4.7 中为 2D 玩家或敌人编写移动与碰撞控制,适用于平台跳跃(重力+跳跃)、俯视自由八方向、斜坡行走以及地面/墙面检测;也用于排查 move_and_slide() 无效果、角色穿过地板、is_on_floor() 始终为 false 等问题。不适用于动态刚体、Area、射线检测与碰撞层设置(见 godot-physics)、瓦片关卡(见 godot-tilemap)、完整平台游戏模板或引擎无关的手感调参。
主要能力与用法:使用带 CollisionShape2D 子节点的 CharacterBody2D,它由脚本驱动,不会自行下落或受力。先设置 velocity 属性,再调用无参的 move_and_slide();该方法读取 velocity、移动并沿表面滑动,再把 velocity 更新为实际结果。逻辑写在 _physics_process(delta) 中,move_and_slide() 内部已含物理步长 delta,不要再把 velocity 乘以 delta。平台跳跃:每帧给 velocity.y 加重力,落地时按跳跃键将 velocity.y 设为负值;俯视移动:由输入构造方向向量乘以速度,并设 motion_mode = MOTION_MODE_FLOATING 以取消地面/墙面区分。移动后可用 is_on_floor()、is_on_wall()、get_wall_normal()、get_slide_collision(i) 读取结果。资料还给出跳跃缓冲(coyote time)示例。
限制与常见问题:3.x 的 move_and_slide(velocity) 签名已移除,4.x 不允许传参。把 velocity 再乘 delta 会使移动极慢。在 _process 中移动会导致帧率相关抖动。up_direction 错误、缺少碰撞形状或当帧未调用 move_and_slide() 会使 is_on_floor() 恒假;缺少或尺寸为零的碰撞形状、地板不在本体的碰撞掩码层内、用 position += 移动,都会导致下陷。闲置时在斜坡滑动需保持 floor_stop_on_slope 为 true 并设置 floor_snap_length。单向平台、移动平台、可变跳跃高度与 move_and_collide() 需查阅其引用的 references/controller-recipes.md。