今日速览
- 物理=碰撞检测(碰到了吗)+碰撞响应(碰到了干嘛),Godot 四大碰撞体各司其职
- CharacterBody2D 适合做玩家角色:引擎只负责”挡”,移动和手感全部代码控制
- RigidBody2D 适合做被推的箱子、掉落的物品:施力即可,引擎算运动
- StaticBody2D 做墙和地板,Area2D 做触发器(捡金币、进区域、伤害圈)
- 碰撞体子节点 CollisionShape2D 千万别用缩放手柄调大小,否则碰撞行为会变得诡异
- 物理代码放
_physics_process(delta)(固定 60Hz),别放_process(逐帧,和物理不同步)
核心学习内容
1. 四种碰撞对象:先选型再写码
所有碰撞对象都继承 CollisionObject2D,但分工完全不同:
| 节点 | 谁移动 | 典型用途 |
|---|---|---|
Area2D | 不参与物理运动 | 检测重叠并发信号:金币触发、敌人警戒圈、传送门、区域重力/阻尼覆盖 |
StaticBody2D | 引擎不动它 | 墙、地板、平台、任何”永远不动”的环境 |
RigidBody2D | 引擎模拟 | 被撞飞的箱子、可堆叠的杂物、掉落物,用 apply_impulse() 施加力 |
CharacterBody2D | 你的代码 | 玩家、AI 角色:自己写 move_and_slide(),引擎只负责碰撞响应 |
新手最容易犯的错:用 RigidBody2D 做玩家,然后在 _process 里直接改 position——这会让物理引擎”打架”(改完又被物理算回去,角色抖动/穿墙)。平台跳跃/俯视角角色一律用 CharacterBody2D。
2. 碰撞层与掩码:游戏规则的隐形开关
每个碰撞对象有 32 个物理层,两个属性:
- collision_layer(层):我属于哪几层(默认都在第 1 层)
- collision_mask(掩码):我扫描哪几层,没在掩码里的对象直接无视
官方示例:Walls/Player/Enemy/Coin 四类对象。玩家 mask 开 walls+enemies+coins,敌人和金币互不理会 → 一行配置就实现了”玩家能捡金币、敌人撞墙会挡、金币不挡人”。建议在 项目设置 > Layer Names > 2D Physics 给层起名(walls、player、enemies…),不然第 5 层是啥过两天就忘了。
3. 物理回调与碰撞形状
- 物理引擎固定 60 次/秒 步进,与渲染帧率无关。所有物理相关代码放
_physics_process(delta),delta是距上一步的秒数(约 0.0167),移动速度记得乘delta才能在不同帧率下表现一致 - 每个物理体至少挂一个
CollisionShape2D(或CollisionPolygon2D)子节点才有碰撞,形状可直接在编辑器里画 - 需要摩擦/弹跳就给 Static/Rigid 挂 PhysicsMaterial:friction 控制摩擦、bounce 控制弹性
- 官方警告:Godot 物理不保证确定性,同场景两次运行结果可能略有不同——重放录像类功能别依赖物理结果
🎯 DeepSeek 提示词
提示词 1:生成平台跳跃角色脚本(CharacterBody2D)
你是一位资深 Godot 4 游戏开发者。请用 GDScript 为 2D 平台跳跃游戏写一个玩家角色脚本。
需求:挂载在 CharacterBody2D 上;支持左右移动(速度 200)、跳跃(初速 -400)、下落(重力 980);
按 A/D 或 ←/→ 移动,空格跳跃,只有在地面(is_on_floor())时才能起跳;
使用 move_and_slide() 处理碰撞,所有数值乘 delta 保证帧率无关。
输出要求:完整可直接粘贴的脚本,附 3 行注释说明如何调整手感(移速/跳高/重力分别改哪个变量)。
提示词 2:设计碰撞层与掩码配置表
你是一位 Godot 4 物理系统专家。我的 2D 游戏有这些对象:玩家、敌人、墙体、平台、金币、子弹、陷阱、NPC。
请设计一套 collision_layer/collision_mask 配置表,规则如下:
玩家撞墙、踩平台、被敌人和陷阱伤害、碰到金币拾取、子弹能打中敌人;
敌人撞墙和平台、能被子弹击中,但不碰金币和 NPC;金币和陷阱互不干扰。
输出格式:Markdown 表格,每行一个对象,列出 所属层(第几层+建议名称)、掩码(哪些层)、以及一句配置理由。
提示词 3:物理 Bug 排查模板
你是 Godot 4 物理调试专家。我的玩家角色(CharacterBody2D)出现以下 bug:
在快速连续跳跃时偶尔会"卡进"墙里,松开按键后又被弹出来;慢速移动时正常。
我怀疑与 _physics_process 里的 move_and_slide() 调用顺序或碰撞形状缩放有关。
请按以下步骤帮我排查:1) 列出该 bug 最常见的 5 个原因(按可能性排序);
2) 针对每个原因给出对应的检查代码/编辑器设置;3) 给出修复后的关键代码片段。
如果信息不足,请明确告诉我需要你提供哪些信息(如移动脚本全文、碰撞体设置截图描述)。
学习心得
物理系统是”游戏感”的第一道关:手感差往往不是美术问题,而是碰撞体选错(用 RigidBody 做角色)或层掩码没配好(子弹打到队友)。对我们的目标——用 DeepSeek 做一款能上架的 Steam 游戏——这意味着:引擎机制(选型/层掩码/回调)必须自己懂,代码可以让 AI 写。今天三条提示词正好覆盖”写新代码→设计配置→查旧 bug”三个日常场景,配合昨天的像素素材,一个能跳、能捡、有碰撞的小原型已经拼得出来了。
明日关注
- 输入系统:用 Input Map 抽象按键,而不是在代码里写死 keycode(为手柄支持做准备)
- 用 Area2D 做一次”进入区域触发事件”(如开局剧情、传送门),体验信号 connect 流程
- 给角色加一次真正的”手感调优”:用 PhysicsMaterial 调地面摩擦,感受参数对移动的影响
本文由自动化学习流水线每日生成,坚持即学即记。
评论