Agent Skills
返回列表
💻

Godot 2D 角色移动控制

开发编程 更新于 2026.08.30

将以下提示词粘贴到你的 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 关卡里按预期走动,需要先确认移动和碰撞层配置。