土狼时间与跳跃缓冲:好跳跃的十二行代码
当玩家说「跳跃手感不好」时,他们通常指的是两个缺失的功能。两个都只要半小时就能写完。
问题长什么样
每个试玩你平台游戏原型的人都说同一句话:「跳跃怪怪的」。没人能说清到底哪里不对。代码是正确的:踩到地面就跳,没踩到就不跳。
问题不在代码,而在人。玩家在意识到自己已经走出平台的那一刻按下按键 —— 但已经晚了。而当他在空中按下跳跃时,他期待落地那一瞬间就起跳。
两个小小的容错窗口
土狼时间在角色离开地面之后,仍然把跳跃权保留一小段时间。这个名字来自动画片里那只冲出悬崖、在空中停顿一拍的土狼。
跳跃缓冲的作用方向正好相反:如果玩家在落地前不久按下了按键,这次按键会被记住,并在接触地面的瞬间生效。
private void HandleJump()
{
if (IsGrounded) _coyote = COYOTE_TIME;
else _coyote -= Time.deltaTime;
if (_input.JumpPressed) _buffer = BUFFER_TIME;
else _buffer -= Time.deltaTime;
if (_buffer > 0f && _coyote > 0f)
{
_velocity.y = _jumpForce;
_coyote = _buffer = 0f;
Feedback.Play("jump_launch");
}
}
csharpPlayerJump.cs
数值该怎么定
在我测量过的项目里,两个窗口取 100–150 毫秒都工作得很好,也就是 60 FPS 下的 6 到 9 帧。更短就感觉不到,更长则会像是在空中起跳。
不要把这些数值写死在代码里。放进 ScriptableObject 或数据表,设计师必须能在不启动游戏的情况下调整它们。
这个思路能走多远
同样的逻辑在别处一样有效:攻击输入缓冲、二段跳容错、边缘抓取的判定窗口,甚至菜单切换时的按键队列。
通则是:当玩家的意图与游戏规则冲突时,判给玩家。做到这一点的游戏,才会被形容为「跟手」。