Godot 2D 角色移动控制
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/godot-2d-movement-sh-9v2tv8。
技能介绍
要解决的具体问题
在 Godot 4.x 里开发 2D 角色时,常会遇到几个棘手问题:move_and_slide() 还是按 3.x 的传参方式调用导致编译报错,角色莫名下沉穿过地板,is_on_floor() 始终返回 false 导致跳跃失效,或者移动逻辑写进 _process 后出现帧率相关的抖动。另外,平台跳跃中的土狼时间(Coyote time)、斜坡滑动等问题也需要针对性处理方案。
核心工作流
这个技能围绕 CharacterBody2D 展开,关键步骤如下:
- 用
CharacterBody2D作为角色节点,搭配子节点CollisionShape2D处理碰撞。注意它不会自动下落或响应外力,完全由脚本驱动。 - 移动逻辑统一写在
_physics_process(delta)里:先给velocity属性赋值,再调用无参的move_and_slide()。这个方法会自动读取velocity、移动节点、沿表面滑动,并更新velocity为实际碰撞后的速度。 - 平台跳跃场景:每帧给
velocity.y加重力值,当is_on_floor()为真时,将velocity.y设为负值实现跳跃;俯视角场景:根据输入构建方向向量并乘以速度,设置motion_mode = MOTION_MODE_FLOATING消除地板和墙壁的区别。 - 移动后用
is_on_wall()、get_wall_normal()、get_slide_collision(i)等方法获取碰撞反馈。
常见问题避坑
- 别在
velocity上再乘以delta,move_and_slide()内部已经处理了物理步长的 delta,否则角色会移动极慢。 - 不要把移动逻辑放进
_process,会导致帧率相关的抖动,必须在_physics_process里执行。 is_on_floor()失效时,检查up_direction是否正确(默认Vector2.UP)、是否有CollisionShape2D子节点,以及当前帧是否调用了move_and_slide()。- 角色下沉通常是因为碰撞形状缺失、地板层不在当前节点的掩码里,或者直接用
position +=移动而非velocity + move_and_slide()。
适用边界
不适合处理动态刚体、碰撞区域、射线检测、碰撞层等物理逻辑(对应 godot-physics 技能);不适合 tile 地图关卡构建(对应 godot-tilemap 技能);也不用于完整平台跳跃模板或与引擎无关的手感调优。
使用场景
- 在 Godot 4.3 横版平台跳跃项目里,需要给玩家实现重力、跳跃、斜坡站立和落地检测。
- 开发俯视角 2D 原型时,需要支持八方向移动,并避免地板和墙壁区分带来的卡顿。
- 排查现有 2D 角色控制器中 move_and_slide() 不生效、角色穿地板或 is_on_floor() 一直为 false 的问题。
- 给敌人或玩家搭建移动基座,先实现基于 velocity 和 move_and_slide() 的碰撞滑动,再接状态机。
适合人员
- 独立游戏开发者:在 Godot 4.3 中做 2D 平台跳跃或俯视角原型,需要先跑通角色移动与碰撞。
- Godot 客户端工程师:维护现有 2D 角色控制器,遇到 move_and_slide() 无参签名或 is_on_floor() 失效问题。
- 游戏设计学生:毕业设计或课程项目需要角色在平台间跳跃、沿斜坡移动并响应墙壁碰撞。
- 关卡或玩法策划:验证角色能否在 tile 关卡里按预期走动,需要先确认移动和碰撞层配置。