У меня очень простой сценарий перемещения, прикрепленный к объекту, который позволяет мне перемещать объект вверх, вниз, влево или вправо с импульсом. Прошлой ночью я подумал, что сценарий работает нормально, никаких проблем. Я заметил какое-то бесконечно малое движение объекта, но отбросил его, поскольку объект просто рисуется каждый кадр, или он «качается» из-за кода.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);
}
Может ли время.deltaTime варьироваться между звонками? Если это так, то код замедления не просто уменьшает скорость, но накладывает на него Min или Max, поэтому отрицательная скорость не станет положительной и наоборот. – Martheen