C# Unity 3D计时器似乎运行得太快了

C# Unity 3D计时器似乎运行得太快了,c#,unity3d,C#,Unity3d,当用户按下按钮时,fwdi设置为1,这将启动此if语句。在我看来,如果每次更新我都将fwdi减少0.1,并且每次更新都将玩家移动0.1,那么一切都应该在1秒的时间内完成,但是移动速度要比1秒快得多。我有一个动画,也发挥了这需要1秒,他们不匹配 编辑 现在我对统一几乎一无所知,所以这可能不太可能是一个答案。通常情况下,你会通过计算一个因子使游戏中的帧速率独立,比如说,如果你不想在一秒钟内移动一段距离,你就要计算经过的时间并应用乘法。例如,“时间通过系数*amounttomove” 根据我

当用户按下按钮时,fwdi设置为1,这将启动此if语句。在我看来,如果每次更新我都将fwdi减少0.1,并且每次更新都将玩家移动0.1,那么一切都应该在1秒的时间内完成,但是移动速度要比1秒快得多。我有一个动画,也发挥了这需要1秒,他们不匹配

编辑

现在我对统一几乎一无所知,所以这可能不太可能是一个答案。通常情况下,你会通过计算一个因子使游戏中的帧速率独立,比如说,如果你不想在一秒钟内移动一段距离,你就要计算经过的时间并应用乘法。例如,“时间通过系数*amounttomove”

根据我收集的信息,你需要使用
Time.deltaTime
,它将为你提供帧间经过的实际时间,其中as
timeScale
实际上只是用于慢动作等


所以。。。amountToMove.y=1f*时间增量*

在补偿帧时(即:以每秒60帧的速度,更新被称为每秒60次)中需要做的所有事情

还考虑在<代码>固定更新> /代码>上进行移动。固定更新的工作原理与更新类似,但有几个关键区别:

-Fixedupdate的优先级高于正常的更新功能

-unity固定更新的默认呼叫上限为每秒20次

void Update ()
{
    if (fwdi > 0)
    {
        amountToMove.y = 0.1f*Time.deltaTime;
        transform.Translate (amountToMove);
        fwdi = fwdi - amountToMove.y;
        //This code bellow looks redundant, and probably unnecessary
        if (fwdi == 0)
        {
            amountToMove.y = 0;
            fwdi = 0f;
        }
    }
}
通常建议您将,轻量级进程放在固定更新上,以从可预测的更新间隔中获益,如移动和物理


注意::最好将
FixedUpdate
中的所有内容乘以
时间。fixedDeltaTime
,以防FixedUpdate无法达到每秒20次计数

谢谢,我已经把时间整理好了,现在可以实时计算了。我把脚本附加到一个非活动对象上,一旦我删除了它,由于某种原因,它的计时就恢复正常了。现在它几乎完美了,但是每次我移动播放器时,移动的幅度都很大。y=1.0f,实际上它会移动到接近1.02f的位置,虽然听起来不太明显。有没有办法让这一站停在1号?我已经更新了我所拥有的,谢谢你的帮助。我尝试使用FixedUpdate和FixedDelatime,但是这会产生比不使用fixed更大的差异。删除第二个if语句稍微改善了结果,但是移动距离仍然比应该的大一点点。
if(amountToMove.y>1.0f)amountToMove.y=1.0f
@Spunk喇叭将此作为一个新问题发布,我可以尝试给它一个正确的答案,这是一个非常著名的问题,困扰着诸如寻路和物理之类的事情。值得理解的是,它为什么会发生,以及如何在个案基础上避免
void Update ()
{
    if (fwdi > 0)
    {
        amountToMove.y = 0.1f*Time.deltaTime;
        transform.Translate (amountToMove);
        fwdi = fwdi - amountToMove.y;
        //This code bellow looks redundant, and probably unnecessary
        if (fwdi == 0)
        {
            amountToMove.y = 0;
            fwdi = 0f;
        }
    }
}