Godot 4 物理与碰撞
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/godot-physics-sh-vw1zla。
技能介绍
要解决什么问题
在 Godot 4.x 里做 2D/3D 玩法时,物理相关 bug 往往集中在几类:该用哪种 Body、碰撞层和遮罩为什么对不上、触发区不触发、刚体被直接改 position 后抖动穿模,以及 射线读到过期结果。本技能面向 Godot 4.3+,把 2D/3D 共用的一套概念讲清楚(节点名换 2D/3D 后缀即可)。
技能如何帮你落地
核心流程可以按五步记:
- 选物理体类型:
StaticBody做静态挡板;RigidBody交给模拟(力/冲量或linear_velocity,别硬拽位置);CharacterBody走脚本驱动的运动学(细节见 godot-2d-movement);Area做重叠检测并可施加重力/阻尼,没有实体碰撞。每个 Body 都需要子节点CollisionShape或CollisionPolygon。 - 配 layers 与 masks:Body 在 layer 上声明「我是谁」,用 mask 声明「我找谁」;只有一方的 layer 落在另一方 mask 里才会交互。建议在 Project Settings > Layer Names 里命名层,避免后期对表困难。
- 用 Area 信号(
body_entered、area_entered)处理触发器、受击框等重叠逻辑。 - 驱动 RigidBody:
apply_force/apply_impulse,或重写_integrate_forces做完整控制。 - 射线检测:挂
RayCast2D/RayCast3D每帧轮询,或在代码里用 space state 做一次查询。
文中还给出从代码设置层遮罩、Area 作 hurtbox、3D 刚体施力、两种 raycast 写法等 Patterns,并单列 Pitfalls(layer/mask 方向性、Area 的 monitoring/monitorable、同帧移动 RayCast 后需 force_raycast_update()、薄墙高速穿透与 continuous_cd、射线排除自身需 query.exclude = [self.get_rid()] 等)。
适用边界
- 不要用本技能替代:角色
move_and_slide运动学控制器 → godot-2d-movement;瓦片碰撞搭建 → godot-tilemap;时间步、质量、手感调参 → physics-tuning。 - 关节、单向碰撞、
PhysicsServer直连、形状查询、move_and_collide等进阶内容见技能内 references/bodies-and-queries.md。
使用场景
- 在 Godot 4 横版关卡里为敌人挂 `Area2D` 受击框,用 `body_entered` 判定玩家攻击是否命中
- 新项目上线前统一命名碰撞层,并给玩家、子弹、地形分别设置 layer 与 mask,避免误碰撞
- 平台跳跃角色落地前用 `RayCast2D` 或 space state 射线做地面检测,防止空中误判
- 可拾取道具做成 `RigidBody3D`,用冲量抛出并在薄墙场景里评估是否开启 `continuous_cd`
适合人员
- 独立开发者:用 Godot 4 做 2D/3D 原型,需要在 Static/Rigid/Character/Area 之间选型并接上碰撞形状
- 关卡设计师兼脚本:同一场景里要配置多层碰撞关系,但 layer 与 mask 经常对不上导致「打不中」
- 刚体玩法程序员:道具、箱子等 `RigidBody` 被直接改 `position` 后出现抖动穿模,想改成力/冲量或 `_integrate_forces`
- 技术向策划或 TA:要为视线、地面、斜坡做射线查询,并处理同帧移动 RayCast 后读到过期命中