Unity 3D Timer似乎运行得太快

时间:2013-12-19 06:21:32

标签: c# unity3d

当用户按下按钮时,fwdi设置为1,启动此if语句。对我来说似乎合乎逻辑的是,如果我每次更新都将fwdi减少0.1并且每次更新都会移动玩家0.1,那么一切都应该由1秒标记完成,但是移动速度比1秒快得多。我有一个动画,也需要1秒,但它们不匹配。

修改

void Update ()
{

    if (fwdi > 0.0f)
    {

        fwdi = fwdi - 1.0f * Time.deltaTime;
        amountToMove.y = 1.0f * Time.deltaTime;
        transform.Translate (amountToMove);
        if (fwdi == 0.0f)
        {

            amountToMove.y = 0.0f;
            fwdi = 0.0f;
        }
    }
}

2 个答案:

答案 0 :(得分:4)

所有你需要做的就是补偿帧时间(IE:60fps,更新称为每秒60次)

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上。固定更新与使用几个关键点不同的更新类似:

-Fixedupdate优先于正常更新功能,

固定更新的单位默认通话上限为每秒20次

通常建议你放置轻量级进程,这些进程可以从固定更新的可预测更新间隔中受益,例如移动和物理。

注意 ::将FixedUpdate中的所有内容乘以Time.fixedDeltaTime仍然是一个好主意,以防万一.Infixupdate无法达到每秒20个刻度。

答案 1 :(得分:0)

现在我对Unity几乎一无所知,所以这可能不会接近答案。通常情况下,你会通过计算一个因子来使游戏帧速率独立,例如,如果你不想在一秒内移动1个距离,你计算的时间通过并应用乘法。例如。 “timepasssed-factor * amounttomove”

从我可以收集到的内容中,您需要使用Time.deltaTime,这将为您提供帧之间传递的实际时间,其中timeScale实际上只是用于慢动作等...

所以... amountToMove.y = 1f * Time.deltaTime * ???;