性能优化
用 CharacterBody2D 实现手感驱动的 2D…
在 Godot 中为玩家、NPC 或敌人编写响应灵敏、手感优先的 2D 移动控制器时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 CharacterBody2D 实现通用
解决思路
- 标准玩家控制器一律用 CharacterBody2D,不要用 RigidBody2D(后者用于物理模拟物体)。
- 调用 move_and_slide() 前不要把 velocity 乘以 delta,move_and_slide() 内部已处理 delta,手动相乘会导致帧率相关。
- 游戏移动只通过 velocity + move_and_slide(),不要直接改 global_position,否则会绕过碰撞、贴地和单向平台规则。
- 单向平台穿透不要靠微调 position.y,而要用单向碰撞形状 + layer/mask(临时禁用 mask 或 collide-with-areas 模式)。
- move_and_slide() 之后必须读取 is_on_floor()、is_on_wall()、is_on_ceiling() 和 slide 碰撞结果,用于郊狼时间、墙跳和撞头逻辑。
- 快速爬楼梯不要依赖默认 floor_snap_length,默认吸附太小,需用基于 raycast 的自定义楼梯逻辑。
- is_on_floor() 为 true 时不要施加重力,持续向下力会造成微抖动并干扰贴地,落地时重置 velocity.y。
- 不要用 Area2D 作为主要地面检测,优先用 is_on_floor() / shapecasts,Area 只用于触发器。
- 不要忘记天花板撞头:is_on_ceiling() 时重置 velocity.y,否则角色会一直贴顶直到重力胜出。
- 像素画不要对物理位置取整,物理保持高精度,只在 _process 中对 sprite 位置取整。
- 大量生成/销毁时不要频繁 queue_free(),对子弹/敌人使用对象池。
- 平台跳跃基础(郊狼时间、跳跃缓冲、加速/摩擦)先加载 expert_physics_2d.gd。
- 只需郊狼/缓冲时用 frame_perfect_coyote_time.gd。
- 可变跳跃高度/短跳用 variable_jump_height.gd。
- 斜坡/楼梯用 slope_stair_snapping.gd,配合 godot-raycasting-queries。
- 墙滑/墙跳用 wall_slide_jump_refined.gd 或 wall_jump_controller.gd(除非对比否则不要同时加载)。
- 冲刺 + 无敌帧用 dash_state_controller.gd 或 dash_controller.gd(除非对比否则不要同时加载)。
- 空中控制打磨用 aerial_drift_acceleration.gd。
- 天花板吸附/撞头用 ceiling_bonk_detection.gd。
- 击退/风推力用 impulse_response_handler.gd。
- 像素画视觉用 subpixel_movement_rounding.gd,不要在物理中取整 global_position。
- 大量 AI 身体用 performance_character_pooling.gd。
- 单向平台:在平台碰撞体上设置单向(CollisionShape2D one-way / TileSet physics one-way),不要传送玩家。
- 单向平台:把平台和玩家放在明确的碰撞 layer/mask 上,按住下 + 跳时临时清除平台位(或禁用 collide-with),随后几个物理帧恢复。
- 单向平台:穿透逻辑保持在物理 tick 上,绝不用 position 微调绕过 move_and_slide。
- 瓦片单向平台:对齐 TileSet 物理层与 CharacterBody 的 mask,参考 godot-tilemap-mastery 和 godot-2d-physics。
- 俯视/坦克移动配方参考 movement-recipes.md,不要用内联 8 方向教程。
- 跳跃弧线调试调参用 game_feel_profiler.gd。
- 动画根运动用 root_motion_controller.gd,配合 godot-2d-animation。
- 墙贴(可变摩擦):下落时监测 is_on_wall(),用摩擦系数缩放 velocity.y(可来自 tile 自定义数据),而不是二元墙滑布尔值,优先用 wall_slide_jump_refined.gd。
- 动画驱动移动(根运动):取 AnimationTree.get_root_motion_position(),转为 2D,赋值 velocity = motion / delta,再 move_and_slide(),配合 godot-2d-animation。
- 游戏手感分析器(跳跃弧线):在 _draw() 中调试绘制历史位置和当前 velocity,可视化顶点、郊狼和缓冲窗口,配合 expert_physics_2d.gd 的导出参数调参。
- 黄金路径:先读 expert_physics_2d.gd,控制器就位后再加冲刺/墙/跳跃脚本,脚本已负责郊狼/缓冲/加速循环时不要在场景中重复内联。
适用边界 · 注意事项
- 需要物理模拟的滚动物体、布娃娃道具、力堆叠时,应使用 RigidBody2D 而非 CharacterBody2D。
- 静态关卡碰撞体应使用 StaticBody2D / TileMapLayer 物理,而非 CharacterBody2D。
- 当 expert_physics_2d.gd 已覆盖你的平台跳跃范围时,不要再加载 movement-recipes.md。