SuperAPI AI 工具集

godot-game-loop-time-trial

编程与开发

查看项目

更新于 10-16 10:40

技能介绍

用途

本技能用于在 Godot 4 中构建计时赛(Time Trial)类玩法,适用场景包括竞速游戏、速通平台跳跃游戏与街机挑战模式。其核心是把计时赛实现为「状态验证链」(Validation-Chain):记录一个时间很简单,但要确保玩家没有通过捷径作弊,就需要严格有序的检查点管理器。

主要能力

中央计时与检查点校验

  • TimeTrialManager 作为中央时钟,负责校验检查点顺序并处理「最佳圈速」逻辑。
  • Checkpoint 作为空间触发器,在物理帧中通知管理器。
  • 通过要求按数字顺序依次通过检查点,防止「捷径作弊」。

幽灵录制与回放

  • GhostRecorder 捕获高频变换数据,使用基于 delta 时间的时间戳,实现与帧率无关的回放。
  • 以固定频率采样(例如 10 Hz),位置使用 lerp 插值,旋转使用 Quaternion 的 slerp 插值。
  • 幽灵只记录核心变换(位置/旋转),不记录整个玩家对象。
  • 幽灵不应具有碰撞,仅作为纯视觉指示(例如半透明)。

数据存储选择

技能提供数据存储决策矩阵:

格式 适用场景 实现方式
Dictionary Array 原型开发 简单的 [{t: 0.1, p: pos}, ...]
Typed Array 性能优先 位置使用 PackedVector3Array
JSON/Binary 存档 用 FileAccess.get_var() 保存幽灵文件

另提供 Delta-Compression 模式:仅当位置/旋转变化超过阈值时存储关键帧,并用 FileAccess.open_compressed() + ZSTD 持久化,优先使用二进制浮点而非 JSON。

排行榜桥接

  • 以整数微秒/毫秒存储记录,使用 %02d:%02d.%03d 格式化输出稳定 UI 字符串(例如 01:24.450)。

多人竞速

  • 位置同步使用 ENetMultiplayerPeer 与 TRANSFER_MODE_UNRELIABLE,而非 TCP 式可靠传输。
  • 终点线/圈数跨越必须在权威服务端使用 multiplayer.is_server() 校验。

使用方式

技能附带以下脚本,并要求按「黄金路径」顺序阅读后再编写对应阶段的代码:

  1. time_trial_manager.gd — 微秒(Time.get_ticks_usec)或物理帧时钟;pass_checkpoint 仅从物理重叠 / Area 信号调用。
  2. Checkpoint Areas — 按索引顺序接入管理器(在物理帧中,而非 _process)。
  3. ghost_recorder.gd — 采样 {t, p, q},旋转使用 Quaternion。
  4. ghost_replayer.gd — 位置 lerp + Quaternion slerp(绝不使用欧拉插值)。
  5. time_trial_leaderboard_bridge.gd — 整数微秒/毫秒转为 UI 字符串。

脚本索引还包含 time_trial_patterns.gd(10 种专家模式:微秒计时、服务端权威校验、橡皮筋 AI、帧精确输入刷新)与 time_trial_playback_buffer.gd(网络流式传输幽灵回放的抖动缓冲)。

关键约束(NEVER Do)

  • 不使用 OS.get_ticks_msec() 做高精度竞速计时,应使用 Time.get_ticks_usec() 获得微秒精度。
  • 不完全依赖 _process() 触发终点检测,应在 _physics_process() 中评估物理重叠。
  • 不在实例化后立即评估 Area3D 重叠,需先 await get_tree().physics_frame 等待物理服务器同步。
  • 不对检查点的 CollisionShape3D 做非等比缩放,应缩放内部形状资源(例如 BoxShape3D.size)。
  • 多人竞速同步位置不使用 TCP(可靠传输)。
  • 不信任客户端的终点线/圈数判定,需在权威服务端校验。
  • 不使用标准浮点相等(==)比较记录圈速,应使用 is_equal_approx()。
  • 不在不刷新缓冲区的情况下硬编码输入检查,帧精确操作需调用 Input.flush_buffered_events()。
  • 不在快速寻路循环中分配新的 Vector3 数组,应使用 PackedVector3Array。
  • 不在紧凑循环中使用动态字符串路径(如 $"../Checkpoint"),应使用 @onready 缓存节点引用。
  • 不忽视检查点顺序,需验证玩家按正确顺序通过每个中间检查点。
  • 使用 Area3D 时需做 monitoring 优化,仅检测 Player 物理层。
  • 幽灵旋转不使用标准 lerp,应使用 slerp() / Quaternion.slerp() 避免万向节锁。

适用前置与配套

技能声明了前置技能(godot-project-foundations、godot-physics-3d、godot-signal-architecture、godot-gdscript-mastery)、互补技能(输入处理、存档系统、多人网络、单机转多人、导航寻路、蒙特卡洛平衡器、摄像机系统)以及下游消费者(竞速品类、游戏循环合集)。

限制

本技能基于 Godot 4 引擎与 GDScript。技能未提供具体收费、价格或平台信息。