Files
2026-09-24 16:35:28 +08:00

1.7 KiB
Raw Permalink Blame History

2026-09-24

滑索(Zipline)组件 —— 新增

需求:Godot 4 第三人称滑索,要求全程用 Godot MCP 搭建。

新增 / 改动:

  • world/zipline/zipline.gd + zipline.tscn:两个 Marker3D 锚点 + 抛物线下垂曲线。 缆绳网格在 _ready() 用 SurfaceTool 现造,子节点不给 owner → 不会被写进 .tscn。 对外接口:sample / tangent / ride_point / closest_point;手感参数(速度、刹车、吸附半径)都放在这一侧。
  • character/player/player.gd:新增 _find_zipline / _attach_zipline / _detach_zipline / _ride_zipline。 缆上直接写 global_position,不走 move_and_slide();相机在缆上缓慢对齐到行进方向。
  • character/player/player.tscn:新增 InteractHint(Label3D),沿用 HealthLabel 的「节点配置」做法。
  • project.godot:新增 interact 输入动作(E)。
  • world/main.tscn:演示关卡 —— LaunchRamp(26.57° 斜引道)+ LaunchDeck(顶面 y=6.0)+ Zipline 实例。
  • tests/test_zipline.gd:13 项回归测试,钉住几何契约(端点、下垂量、切线方向、下滑方向、悬挂偏移)。

验证:全量测试 20/20 通过(180 条断言);实跑三次,按 E 后玩家从 (0,0,0) 滑到 (0,0,18.8) 缆末端。

关键取舍:

  • sag 定义成「中点下垂深度」而不是比例 —— 调参所见即所得,不用解悬链线方程。
  • 出口固定为较低的那个锚点(滑索只能往下滑),两端等高时退回 A→B。
  • 模型里没有滑索动画片段,所以缆上复用下落姿态:animator.set_motion(velocity, false, false), 没有为此在 PlayerAnimator 里加新状态。