Unity C# Time.deltaTime bug

本文关键字:bug deltaTime Time Unity | 更新日期: 2023-09-27 18:07:07

我有一个非常简单的移动脚本附加到一个对象,允许我向上,向下,向左或向右移动对象的动量。昨晚我觉得剧本很好,没有问题。我注意到物体的一些无限小的运动,但将其丢弃为简单地每帧绘制的物体,或者由于代码而"摇摆"。

然而,今天我回到家,把它点燃,物体立即跳起来,向右,移动得非常快。在进行了一些调试之后,我感觉自己要疯了,因为我没有更改任何东西,我注意到我的笔记本电脑没有插上电源,从而降低了机器的功率,并提示我可能导致错误的原因。

我试过玩代码,添加和删除时间。Delta时间来改善它,但似乎不能让这个问题消失。删除所有的time . deltatitimes会让情况变得更糟,而将它们放在任何地方也无法解决问题。

虽然时间问题是导致我注意到这个问题的原因,但我怀疑我的真正问题可能是在我的移动代码中的某个地方,因为即使我没有按下按钮,游戏仍然在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);
}

Unity C# Time.deltaTime bug

对我来说,最重要的一点是,即使你没有提供输入,玩家也会移动。除非我错过了什么,否则加速度和减速在您提供的代码片段中永远不会改变。考虑到减速是恒定的,并且自游戏开始以来您没有提供输入,请考虑代码片段的这一部分:

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

当你第一次评估这个条件时,速度视界为零(你的玩家从静止状态开始,对吗?),减速为12,时间。DeltaTime可能不为零。这意味着你的if条件求值为0 <12 *[正数],这是真的。然后speedHorz将从0变为大于0的值,即使你没有按任何按钮,你的播放器也会有一点速度。