今日速览

  • 碰撞 = 检测 + 响应:先知道”撞上了”,再决定”撞了之后怎样”,Godot 的四种碰撞体帮你分工。
  • 四选一口诀:静态环境用 StaticBody2D,纯检测用 Area2D,真实物理用 RigidBody2D,角色操控用 CharacterBody2D。
  • 角色移动绝不能直接改 position,要用 move_and_slide() / move_and_collide(),且代码必须写在 _physics_process() 里。
  • 碰撞图层(Layer/Mask)是 32 位的开关矩阵,配好它,敌人和金币互不干扰、玩家都能撞——不用写一行 if。
  • 新手 80% 的”穿墙/陷地”bug,都是忘了给碰撞体加 CollisionShape2D,或缩放用了节点 Scale 而非尺寸手柄。

核心学习内容

1. 四大碰撞体,选对就赢一半

  • Area2D(区域):只”感知”不”阻挡”,重叠时发 body_entered / body_exited 信号。做捡金币、陷阱触发、敌人警戒圈,全用它,还能局部改写重力。
  • StaticBody2D(静态体):地板、墙壁、平台这类不动的环境,参与碰撞但不被撞飞。可以配 PhysicsMaterial 调摩擦/弹力(如冰面、弹跳床)。
  • RigidBody2D(刚体):交给物理引擎模拟——你只施加力/冲量,它自己算运动。适合可推动的箱子、被炸飞的碎片。
  • CharacterBody2D(角色体):引擎不管它,代码全权控制移动和碰撞响应。2D 平台跳跃、俯视角 RPG 的主角都用它,可控性最强。

2. 移动的两把钥匙:move_and_slide 与 move_and_collide

  • move_and_collide(velocity * delta):沿向量移动,撞到就立刻停下并返回 KinematicCollision2D。适合子弹反弹、需要精确处理单次碰撞的场景。
  • move_and_slide():自动处理”贴着障碍滑行”,平台跳跃首选。它读取节点的 velocity、motion_mode(GROUNDED 地面模式/ FLOATING 浮动模式)、up_direction 等属性,并自动更新 velocity。
  • 配套 API:is_on_floor() / is_on_wall() / is_on_ceiling() 判断贴地状态,get_slide_collision_count() + get_slide_collision(i) 遍历本次滑动发生的所有碰撞。
  • 硬性纪律:物理代码进 _physics_process(delta)(固定 60Hz),别写进 _process(),否则帧率一变手感就漂。

3. 碰撞图层与掩码:一张位图管天下

每个碰撞对象有 32 个图层。collision_layer 表示”我在第几层”,collision_mask 表示”我扫描哪几层”。经典例子:墙、玩家、敌人、金币各占 1-4 层;玩家 mask 开墙+敌人+金币,敌人和金币的 mask 互相不开——于是玩家踩敌人、捡金币,敌人却不会挡金币。命名可在 项目设置 → Layer Names → 2D Physics 里配,代码里用位运算(如 0b1101 或 (1<<1)|(1<<3)|(1<<4))或 set_collision_mask_value(n, true) 设置。

4. 三个高频翻车点

  1. 没加 CollisionShape2D:检测碰撞的前提是”至少一个形状”,光挂节点不画形状 = 空气墙。
  2. 缩放碰撞体:改碰撞形状尺寸要用 Inspector 的尺寸手柄,不要动节点的 Scale,否则碰撞行为会诡异。
  3. 物理不可预期:Godot 物理不是确定性的,同样的输入可能跑出微小差异,别指望”帧级复现”用于联机同步。

🎯 DeepSeek 提示词

提示词 1:生成平台跳跃角色完整脚本(新手抄作业级)

你是一名资深 Godot 4 游戏开发工程师。请用 GDScript 写一个 2D 平台跳跃角色脚本,挂在 CharacterBody2D 节点上。

需求:
1. 属性:移动速度 300、跳跃速度 450、重力 980,全部用 @export 暴露可在编辑器调整;
2. 输入:左右方向键/AD 控制水平移动,空格/上键跳跃,仅在地面时允许跳跃(用 is_on_floor() 判断),支持跳跃缓冲和土狼时间(各 0.1 秒);
3. 移动必须用 move_and_slide(),写在 _physics_process(delta) 里,所有计算乘以 delta 保证帧率无关;
4. 跳跃后落地要能重置跳跃次数,空中松开跳跃键提前截断上升速度(可变跳跃高度)。

输出要求:完整可直接粘贴的 .gd 文件内容,用代码块包好;每段关键逻辑加一行中文注释;最后用 3 句话说明如何挂载到节点(需要哪些子节点/碰撞形状)。

使用说明:直接丢给 DeepSeek,它会给出一份带土狼时间、跳跃缓冲的”手感级”角色脚本,比自己从零写省 1 小时。要求它输出”挂载说明”能避免你漏掉 CollisionShape2D。

提示词 2:让 DeepSeek 设计碰撞图层分配方案

你是 Godot 物理系统专家。我正在做一个俯视角 2D 游戏,有这些对象:玩家、敌人、墙壁、道具(可拾取)、子弹、水面(踩上去减速的区域)。

请给我一份碰撞图层分配方案,要求:
1. 用表格列出每个对象:所属层号、mask 扫描哪些层、使用哪种碰撞体类型(CharacterBody2D/StaticBody2D/RigidBody2D/Area2D)及理由;
2. 规则:子弹能打中敌人和玩家但不能打中自己人(敌我子弹分开);道具只能被玩家拾取;水面用 Area2D 且不阻挡任何物体;
3. 给出关键对象在代码里设置 layer/mask 的 GDScript 示例(用 set_collision_layer_value / set_collision_mask_value);
4. 指出这套方案最容易踩的坑。

输出格式:Markdown 表格 + 代码块 + 要点列表。

使用说明:设计期先让 AI 把”谁跟谁碰撞”理成表格,再照着在编辑器里勾选,比边写边改省事得多,还能提前发现”子弹打自己人”这类逻辑漏洞。

提示词 3:碰撞 Bug 排查模板(debug 神器)

你是 Godot 4 调试专家。我的 2D 平台游戏出现以下问题:角色在斜坡上会卡顿抖动,偶尔直接穿到地板下面;金币的 Area2D 信号有时触发有时不触发。请按顺序排查并给出修复代码:

1. 列出该症状的 5 个最常见原因(按可能性排序);
2. 针对每个原因,告诉我检查方法(在哪看、看什么属性);
3. 重点检查项:碰撞形状是否用了节点缩放、move_and_slide 是否在 _physics_process 中调用、Area2D 的 monitoring/monitorable 是否开启、碰撞形状是否每帧被重建、斜坡角度是否超过 floor_max_angle(45°);
4. 给出修复后的关键代码片段。

输出格式:编号列表 + 每个原因的检查清单 + 最终修复代码。

使用说明:遇到碰撞玄学问题就把报错现象粘进去,DeepSeek 会按”可能性排序”带你排查,避免瞎试。记住把”斜坡抖动”这类关键词换成你自己的现象即可。

学习心得

物理与碰撞是 2D 游戏的骨架——没有它,角色和世界就是两张贴图。今天最大的收获是”选对碰撞体类型”这个决策框架:以前总想用 RigidBody2D 做角色(被物理引擎坑得乱飘),现在明确 CharacterBody2D + move_and_slide 才是平台跳跃的正解。配合 DeepSeek 生成脚本 + 图层方案,一个可碰撞、可跳跃、可拾取的小原型半天就能搭出来,这正是”用 DeepSeek 从零做 Steam 游戏”路线图上最关键的地基。

明日关注

  • 用提示词 1 生成角色脚本,在 Godot 里搭一个带地面和墙壁的测试场景,跑通移动+跳跃+落地
  • 按提示词 2 的图层表,给游戏配好 Layer Names 命名,测试敌人/金币互不干扰
  • 记录一个真实遇到的碰撞 bug(哪怕很小),用提示词 3 走一遍排查流程

本文由自动化学习流水线每日生成,坚持即学即记。