2016-09-15 4 views
0

У меня очень простой сценарий перемещения, прикрепленный к объекту, который позволяет мне перемещать объект вверх, вниз, влево или вправо с импульсом. Прошлой ночью я подумал, что сценарий работает нормально, никаких проблем. Я заметил какое-то бесконечно малое движение объекта, но отбросил его, поскольку объект просто рисуется каждый кадр, или он «качается» из-за кода.Unity C# Time.deltaTime bug

Однако сегодня я вернулся домой, выстрелил в него, и объект сразу же вскочил и направился и двинулся очень быстро. После некоторой отладки и ощущения, что я схожу с ума, так как я ничего не изменил, я заметил, что мой ноутбук не был подключен, тем самым уменьшая мощность машины и прижимая меня к тому, что может вызвать ошибку.

Я попытался сыграть с кодом, добавив и удалив Time.Delta раз, чтобы улучшить его, но не может показаться, что проблема уходит. Удаление всех Time.deltaTimes делает это намного, намного хуже, в то время как их повсюду не удается устранить проблему.

В то время как проблема времени заставляла меня замечать проблему, я подозреваю, что моя реальная проблема может быть где-то в моем коде движения, так как даже когда я не нажимаю кнопку, игра все еще регистрирует некоторую скорость как на X, так и на Ось Y дает мне возможность подумать, что это, возможно, проблема с операторами if, else, else if.

Любая помощь будет оценена по достоинству.

Мой код ниже:

float speedHorz = 0;  //Horizontal starting speed. 
float maxspHorz = 5;  //Horizontal Max speed. 
float speedVert = 0; 
float maxspVert = 5; 

float acceleration = 8; //How fast the object will reach maximum speed. 
float deceleration = 12; //How fast the object will return to 0. 

void Update() 
{ 
    playerMove(); 
} 

public void playerMove() 
{ 
    //Up and Down, Acceleration 
    if ((Input.GetKey("s")) && (speedVert < maxspVert))      //If you press S and Verticl Speed is less than the max... 
    { 
     speedVert = speedVert - acceleration * Time.deltaTime;    //Lower speed by acceleration, move down... 
    } 

    else if ((Input.GetKey("w")) && (speedVert > -maxspVert)) 
    { 
     speedVert = speedVert + acceleration * Time.deltaTime; 
    } 

    //Up and Down, Deceleration 
    else 
    { 
     if (speedVert > deceleration * Time.deltaTime) 
     { 
      speedVert = speedVert - deceleration * Time.deltaTime; 
     } 

     else if (speedVert < deceleration * Time.deltaTime) 
     { 
      speedVert = speedVert + deceleration * Time.deltaTime; 
     } 

     else speedVert = 0 * Time.deltaTime; 
    } 

    //Left and Right, Acceleration 
    if ((Input.GetKey("a")) && (speedHorz < maxspHorz))     //If you are pressing the "a" key and speed is less than max speed... 
    { 
     //Move Left 
     speedHorz = speedHorz - acceleration * Time.deltaTime;   //Accelerate negatively on the X axis, ie Move Left. 

    } 

    else if ((Input.GetKey("d")) && (speedHorz > -maxspHorz)) 
    { 
     speedHorz = speedHorz + acceleration * Time.deltaTime; 
    } 

    //Left and Right, Deceleration 
    else 
    { 
     if (speedHorz > deceleration * Time.deltaTime) 
     { 
      speedHorz = speedHorz - deceleration * Time.deltaTime; 
     } 

     else if (speedHorz < deceleration * Time.deltaTime) 
     { 
      speedHorz = speedHorz + deceleration * Time.deltaTime; 
     } 

     else speedHorz = 0 * Time.deltaTime; 
    } 

    transform.position = new Vector2(transform.position.x + speedHorz * Time.deltaTime, transform.position.y + speedVert * Time.deltaTime); 

} 
+0

Может ли время.deltaTime варьироваться между звонками? Если это так, то код замедления не просто уменьшает скорость, но накладывает на него Min или Max, поэтому отрицательная скорость не станет положительной и наоборот. – Martheen

ответ

0

Для меня, выступающий бит, что ваш игрок двигается, даже если вы не предоставили вход. Если я что-то пропустил, ускорение и замедление никогда не изменятся в предоставленном фрагменте кода. Учитывая, что торможение постоянным и что вы не подается входной сигнал, так как, начиная игру, считают эту часть вашего сниппета:

else if (speedHorz < deceleration * Time.deltaTime) 
{ 
    speedHorz = speedHorz + deceleration * Time.deltaTime; 
} 

Первый раз, когда вы оценить это условие speedHoriz равен нулю (ваш игрок начинает в состоянии покоя, да?), замедление равно 12, а время.DeltaTime, вероятно, не равно нулю. Это означает, что ваше условие if равно 0 < 12 * [положительное число], что верно. speedHorz будет переходить от нуля к чему-то большему, чем ноль, и ваш плеер будет иметь немного скорости, даже если вы не нажали никаких кнопок.

+0

Я удалил каждую комбинацию Time.deltaTime, которую я могу придумать, все комбинации затрудняют проблему. Я попытаюсь изучить проблему более внимательно в эти выходные, когда у меня будет время. – Magnus22191

+0

Даже если вы удалили Time.deltaTime из бит кода, который я скопировал выше, вы все равно получите движение без ввода. Я уверен, что вам понадобится что-то вроде Time.deltaTime, если вы хотите обрабатывать положение, скорость и ускорение в реальном времени. –

+0

Поразмыслил, как только я хорошо выспался. Спасибо, что указал мне в правильном направлении. Проблема заключается в операторах else. Проверяя, была ли скорость> или <ускорение/торможение, я вызывал движение там, где оно не предназначалось. Правильный код должен выглядеть так: else { if (speedHorz> 0 * Time.deltaTime) { speedHorz = speedHorz - замедление * Time.deltaTime; } else if (speedHorz <0 * Time.deltaTime) { speedHorz = speedHorz + замедление * Time.deltaTime; } – Magnus22191