用途
本技能用于在 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()校验。
使用方式
技能附带以下脚本,并要求按「黄金路径」顺序阅读后再编写对应阶段的代码:
time_trial_manager.gd— 微秒(Time.get_ticks_usec)或物理帧时钟;pass_checkpoint仅从物理重叠 / Area 信号调用。- Checkpoint Areas — 按索引顺序接入管理器(在物理帧中,而非
_process)。 ghost_recorder.gd— 采样{t, p, q},旋转使用 Quaternion。ghost_replayer.gd— 位置lerp+ Quaternionslerp(绝不使用欧拉插值)。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。技能未提供具体收费、价格或平台信息。