Несовместимые времена гонки на абсолютно прямой трассе - PullRequest
0 голосов
/ 18 февраля 2019

Я делаю 2D гоночную игру сверху вниз, которая измеряет время, необходимое игроку, чтобы закончить трек, и я заметил, что даже на абсолютно прямой трассе время финиша не всегда одинаково (автомобиль ускоряется автоматически).

Я пытался установить для обоих максимально допустимого временного шага и фиксированного временного шага одно и то же значение (оба равны 0,02), не уверен, что это как-то повлияет на это.

Для таймера, который я используюSystem.Diagnostics.Stopwatch, который начинается по методу Start()

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 с друг от друга.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Используйте Time.time, если вам нужна постоянная длительность, она всегда кратна Time.fixedDeltaTime в FixedUpdate событии.Если вы хотите большей точности, уменьшите это значение.

0 голосов
/ 18 февраля 2019

Секундомер - это очень точное устройство измерения времени, и 0,02 с равны одному кадру, если вы нажимаете 50 FPS.Система времени Unity является дискретной и увеличивается только тогда, когда начинается новый кадр (или физический кадр), поэтому ничто не «движется в фоновом режиме», вы не можете ожидать точности выше, чем кадр - в Unity нет времени подкадров.

Обратите внимание, что если вы измеряете с помощью секундомера, вы измеряете в режиме реального времени, что означает, что если ваша игра зависает на долю секунды, это увеличит время секундомера, но не увеличит время игры.Как правило, вы должны использовать UnityEngine.Time.time для измерения игрового времени, секундомер обычно используется для оценки производительности (именно поэтому он находится в пространстве имен System.Diagnostics), а не для бизнес-логики.

Кроме того, люди не могут «видеть»'разница в 0,02 с при нормальных условиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...