Godot 物理引擎实战指南
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/godot-physics-rb0v。
技能介绍
解决什么问题
在 Godot 4.3+ 项目里写物理,最常见的问题是:该用哪种物理体。地板用 StaticBody 还是 RigidBody?角色穿墙、触发器不触发、刚体一推就抖动,多半是碰撞层与掩码搞反了。该技能把 2D/3D 通用的物理决策流程整理成一套可执行的参考:从选体类型到射线检测,覆盖日常物理交互的完整链路。
核心能力
1. 选对 body 类型。 StaticBody 不参与模拟(地板、墙壁);RigidBody 受重力和冲量支配,不要直接改 position,而要用 apply_force / apply_impulse 或设 linear_velocity;Area 负责重叠检测,不做实体碰撞。每种体都必须挂 CollisionShape 子节点。
2. 配层与掩码。 层(layer)声明"我是什么",掩码(mask)声明"我检测什么"。A 要检测到 B,B 的层必须出现在 A 的掩码里,且检测可以是单向的——在 Project Settings > Layer Names 里命名层,能显著降低排查成本。
3. 重叠检测与刚体驱动。 用 Area 的 body_entered / area_entered 信号做触发器、受击框;对 RigidBody 施加力与冲量,或重写 _integrate_forces 拿完整控制力。
4. 两种射线方式。 每帧轮询 RayCast2D/3D 节点,或在代码里做一次性 intersect_ray 空间查询;用 query.exclude = [self.get_rid()] 排除自身。
适用边界
- 运动学角色控制器(
move_and_slide)交给godot-2d-movement,Tilemap 碰撞交给godot-tilemap,物理手感调参交给physics-tuning。 - 高频陷阱:直接改
RigidBody的position会和求解器冲突,导致穿透或抖动——要么用冲量,要么进_integrate_forces里瞬移并清零速度。 Area不触发通常是monitoring/monitorable没开,或层与掩码不重叠。- 射线数据要在
_physics_process里读,同 tick 移动后需force_raycast_update()。 - 高速物体会穿薄墙,记得在 RigidBody 上开
continuous_cd或改用射线检测。
使用场景
- 给 2D 平台跳跃游戏搭地板和墙壁时,要选 StaticBody 还是 RigidBody,并挂上合适的 CollisionShape。
- 做宝箱触发开箱动画时,用 Area2D 配置触发区域,并打通碰撞层与掩码让 body_entered 正常触发。
- 实现炮塔射线锁定敌人时,需要在 _physics_process 里轮询 RayCast2D 或调用 intersect_ray 排除自身。
- 处理高速子弹穿透薄墙时,要在 RigidBody 上开启 continuous_cd 或改用射线检测来兜底。
适合人员
- 刚接触 Godot 4.3+ 的独立游戏开发者,卡在物理体类型选择与碰撞层配置上。
- 正在开发 2D 动作游戏、需要做触发器和受击框的 gameplay 程序员。
- 把 3D 原型迁到 Godot、想快速理清 RigidBody3D 受力和射线检测逻辑的客户端工程师。
- 自学 Godot 的留学生,需要一份能对照代码排查层与掩码问题的技术参考。