Unity C#Time.deltaTime错误

时间:2016-09-15 02:19:19

标签: c# unity3d time game-physics

我有一个非常简单的移动脚本附加到一个对象,允许我用动量向上,向下,向左或向右移动对象。昨晚我觉得脚本运行正常,没问题。我注意到物体的一些无限小的运动,但是当它被简单地画在每一帧上时,它被丢弃了,或者它被放弃了#34;由于代码。

然而,今天我回到家,把它开了,物体立刻跳了起来,向右移动了很快。经过一些调试,感觉我疯了,因为我没有改变任何东西,我注意到我的笔记本电脑没有插上电源,从而降低了机器的功率,让我知道可能造成的问题错误。

我尝试过使用代码,添加和删除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);

}

1 个答案:

答案 0 :(得分:0)

对我而言,显而易见的是,即使您没有提供输入,您的播放器也会移动。除非我遗漏了某些内容,否则加速和减速都不会在您提供的代码段中发生变化。鉴于减速是恒定的,并且自开始游戏以来你没有提供输入,请考虑这部分片段:

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

第一次评估这个条件时,speedHoriz为零(你的玩家开始休息,是吗?),减速度是12,而time.DeltaTime可能不是零。这意味着你的if条件评估为0 <0。 12 * [正数],这是真的。 speedHorz将从零变为大于零的东西,即使你没有按任何按钮,你的播放器也会有一点速度。