今日速览

  • 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 把今天的三段代码串成”角色 + 金币 + 关卡”最小可玩原型

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