c# - 在完全笔直的赛道上比赛时间不一致

标签 c# unity-game-engine

我正在制作一款 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/

相关文章:

c# - 控制发送到 AppInsight 跟踪的数据

c# - 如何使用 UnityWebRequest 从服务器下载 Asset Bundle 获取下载进度?

android - 移动设备相机上的简单 AR 叠加

android - 使用unity3d在android中播放视频

android - 屏幕截图图像未显示在 Unity UI 上

unity-game-engine - 启用 Vuforia 时 Unity 崩溃

c# - 无法解析双

c# - 作为 Visual Studio 的替代方案,我有哪些用于 C# 应用程序的小型远程调试器的选项?

c# - 如何在每张账单上生成发票编号

react-native - Unity AR 与 React Native (iOS) 的集成