我正在制作一款 2D 自上而下的赛车游戏,该游戏测量玩家完成赛道所需的时间,我注意到即使在完全笔直的赛道上,完成时间也不总是相同的(汽车自动加速)。
我尝试将最大允许时间步长和固定时间步长设置为相同的值(均为 0.02),不确定这是否对此有任何影响。
对于计时器,我使用在 Start()
方法中启动的 System.Diagnostics.Stopwatch
void Start()
{
checkpoints = GetComponentsInChildren<Checkpoint>();
sw.Start(); //stopwatch starts
Load();
checkpointsReached = 1;
nextCheckpoint = checkpoints[checkpointsReached];
}
当汽车触及标记为完成的触发器时停止。
internal void CheckpointReached(Checkpoint checkpoint)
{
if (nextCheckpoint != checkpoint)
return;
checkpointsReached++;
if (checkpoint.isFinish)
{
sw.Stop(); //stopwatch stops after reaching Finish
EndRace();
return;
}
if (checkpointsReached == checkpoints.Length)
{
checkpointsReached = 0;
}
nextCheckpoint = checkpoints[checkpointsReached];
}
为了获得比赛时间,我使用 sw.Elapsed.ToString("ss','ffff");
汽车加速是在另一个脚本中完成的
void FixedUpdate()
{
Rigidbody2D rb = GetComponent<Rigidbody2D>();
rb.AddForce(transform.up * speedForce); //acceleration
//turning and stuff
rb.angularVelocity = Input.GetAxis("Horizontal") * torqueForce;
rb.velocity = ForwardVelocity() + RightVelocity() * driftFactor;
我希望游戏保持一致和公平,因此我希望直线道路上的完成时间始终相同,但现在时间彼此之间的范围为 +/- 0.02 秒。
最佳答案
秒表是一种非常精确的时间测量设备,如果您提高 50 FPS,0.02 秒等于一帧。 Unity 的时间系统是离散的,仅在新帧(或物理帧)开始时才递增,因此没有任何“在后台移动”,您不能期望精度高于帧 - Unity 中没有子帧时间。
请注意,如果您使用秒表进行测量,则您正在测量硬实时,这意味着如果您的游戏卡住一瞬间,它会添加到秒表时间,但不会添加到游戏时间。一般来说,您应该使用 UnityEngine.Time.time 来测量游戏时间,秒表通常用于性能诊断(这就是为什么它位于 System.Diagnostics 命名空间下),而不是用于业务逻辑。
此外,在正常情况下,人类无法“看到”0.02 秒的差异。
关于c# - 在完全笔直的赛道上比赛时间不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54748365/