今日速览
- Godot 有 4 种碰撞体:Area2D(只检测不阻挡)、StaticBody2D(静态环境)、RigidBody2D(引擎模拟物理)、CharacterBody2D(代码控制运动)。
- 没有 CollisionShape2D 子节点,碰撞体不会产生任何碰撞——形状是碰撞的”身体”。
- CharacterBody2D 永远不要直接改 position,要用
move_and_slide()或move_and_collide()移动。 move_and_slide适合平台跳跃(自动沿墙滑动、自带 is_on_floor);move_and_collide适合子弹/需要精确响应的物体。- 大坑警告:不要在编辑器里缩放碰撞形状,Scale 保持 (1,1),改大小要用尺寸手柄。
核心学习内容
1. 四种碰撞体,一张表选对
| 节点 | 谁控制运动 | 典型用途 |
|---|---|---|
| Area2D | 不运动 | 触发区域:收集品、伤害圈、检测玩家进入 |
| StaticBody2D | 引擎不动它 | 地板、墙壁、平台等环境 |
| RigidBody2D | 引擎模拟(重力/力) | 可推动的箱子、掉落物、物理谜题 |
| CharacterBody2D | 你自己写代码 | 玩家角色、敌人、移动平台、复杂弹道 |
选型口诀:“能动的角色自己写代码(Character),环境永不动的用 Static,要真实物理反馈的交给 Rigid,只管”碰到没碰到”的用 Area。” 做平台跳跃游戏,玩家 = CharacterBody2D,地面 = StaticBody2D,金币/陷阱 = Area2D。
2. CharacterBody2D 两大战术
- move_and_slide():传
velocity(像素/秒),引擎自动处理贴墙滑动和斜坡。配合motion_mode(GROUNDED 侧视跳跃 / FLOATING 俯视),就能用is_on_floor()/is_on_wall()判断脚下有没有地面——跳跃逻辑全靠它。 - move_and_collide():按向量移动,一撞就停并返回
KinematicCollision2D(含撞到了谁、法线方向)。适合子弹反弹、需要自定义响应逻辑的场合。 - ⚠️ 所有物理移动都要放在
_physics_process(delta)里(固定 60 步/秒),而不是_process。
3. 碰撞层与形状的坑
- 碰撞检测靠 layer/mask:layer 是”我是谁”,mask 是”我碰谁”。默认全 1 层,做射击游戏时务必分层(玩家 1、敌人 2、地形 3…),否则子弹会误伤自己。
- 摩擦/弹跳用 PhysicsMaterial 调(StaticBody、RigidBody 可挂),例如冰面摩擦≈0。
- 物理引擎非确定性:同样的场景两次运行结果可能略有差异,别把逻辑赌在”精确的第 3 帧碰撞”上。
🎯 DeepSeek 提示词
① 生成完整平台跳跃角色脚本(含节点结构) 适用场景:要一个能跑能跳、手感可调的玩家角色,直接粘贴到 Godot 4 使用。
你是资深 Godot 4 游戏程序员。请为我写一个 2D 平台跳跃玩家的完整脚本。
任务:基于 CharacterBody2D 实现左右移动 + 跳跃 + 二段跳(可选),使用 move_and_slide(),
并读取 Input 的 ui_left/ui_right/ui_accept 动作。
输出格式:1) 完整 GDScript 代码(含 @export 的移动速度、跳跃力度、重力参数);
2) 所需节点树结构清单(CharacterBody2D 下应挂哪些子节点);
3) 每个 @export 参数的推荐初始值和调节手感的方法。
约束:必须用 _physics_process(delta);不要直接设置 position;代码注释用中文;
最后用 3 句话说明如何把脚本挂到角色上。
② 碰撞层规划助手(防误撞) 适用场景:项目里有玩家、敌人、子弹、地形、道具,不想它们互相乱撞,让 AI 帮你排布 layer/mask。
你是 Godot 4 物理系统专家。我的 2D 游戏有 5 类物体:玩家、敌人、玩家子弹、敌人子弹、地形与道具。
任务:为每类物体规划 collision_layer 和 collision_mask 的位值(1~32 内的 2 的幂),
规则:玩家子弹只碰敌人和地形;敌人子弹只碰玩家和地形;敌人之间互不碰撞;
道具只能被玩家拾取。
输出格式:一张表格(物体 | layer 位值 | mask 位值 | 理由),并在表格后用 5 句话以内解释
"如果我把玩家 mask 配错了会发生什么现象、如何快速排查"。
③ Area2D 触发区域脚本(金币/伤害圈) 适用场景:想写”走进区域就触发事件”的逻辑(拾取金币、进入陷阱、开机关)。
你是 Godot 4 游戏程序员。请写一个可复用的 Area2D 触发区域脚本。
任务:当指定层级的物体(默认玩家层)进入/离开区域时发出自定义信号,
并提供开关区域是否生效的 @export 属性。
输入:区域子节点挂 CollisionShape2D;信号名为 body_entered/body_exited。
输出格式:完整 GDScript 代码 + 一个"拾取金币"的最小使用示例(金币计数 + 隐藏自身),
并说明 body_entered 回调里为什么要先判断 body 是否属于目标层(用 set_collision_mask_value 或分组判断)。
约束:Godot 4.x 语法,中文注释。
学习心得
对”用 DeepSeek 做一款能上架 Steam 的游戏”来说,物理与碰撞是绕不开的骨架:角色落地、踩怪、捡金币、子弹命中,全是今天这 4 种节点的组合。最值钱的经验是先选对碰撞体类型再写代码——让 AI 写脚本前,自己在提示词里把”哪个物体用哪种 Body”说清楚,DeepSeek 生成的代码就能少走一半弯路。配合碰撞层规划,将来加新玩法(联机、弹幕)也不会撞车。
明日关注
- Godot UI 系统:CanvasLayer、Control 节点与游戏内 HUD/主菜单搭建
- 存档系统:ConfigFile / JSON 实现进度保存与读档
- 用 DeepSeek 把今天的三段代码串成”角色 + 金币 + 关卡”最小可玩原型
本文由自动化学习流水线每日生成,坚持即学即记。
评论