随时间推移两个值之间的Lerp

时间:2018-04-10 09:36:35

标签: c# unity3d while-loop floating-point

我正在尝试按时间值减少浮动,我正在使用Unity并停止时间Time.timeScale = 0f;所以不能使用Time.deltaTime所以在while循环中使用'Time.realtimeSinceStartup',我从一个全局脚本中读取主音量变量,玩家可以在游戏中设置0到1之间,所以说我读入0.6并且我想在2秒内将音量降低到0我如何获得百分比继续减少卷数?

这是我的代码..

 private IEnumerator VolumeDown ()
{
    float volumeIncrease = globalVarsScript.musicVolume;
    float volumePercentage = ??;
    float newLerpEndTime = Time.realtimeSinceStartup + 2f;

    while (Time.realtimeSinceStartup < newLerpEndTime)
    {
        audio.volume = volumeIncrease;
        volumeIncrease -= volumePercentage;
        yield return null;
    }
}

抱歉,我无法获得'volumePercentage'

感谢。

1 个答案:

答案 0 :(得分:5)

  

我正在使用Unity并停止时间SetAttribute localSetAttribute = new SetAttribute(140, "B", beeperVolume.getValue(), 0); 因此无法使用   Time.timeScale = 0f;所以在while循环中使用'Time.realtimeSinceStartup'。

您无需使用Time.deltaTime。确实将Time.realtimeSinceStartup设置为 0 会使Time.deltaTime每帧都返回 0

这就是 Unity 4.5 中添加Time.unscaledDeltaTime来解决这个问题的原因。只需将Time.timeScale替换为Time.deltaTime即可。您可以使用Time.unscaledDeltaTime自动决定是使用if (Time.timeScale == 0)还是Time.unscaledDeltaTime

Time.deltaTime

<强>用法

IEnumerator changeValueOverTime(float fromVal, float toVal, float duration)
{
    float counter = 0f;

    while (counter < duration)
    {
        if (Time.timeScale == 0)
            counter += Time.unscaledDeltaTime;
        else
            counter += Time.deltaTime;

        float val = Mathf.Lerp(fromVal, toVal, counter / duration);
        Debug.Log("Val: " + val);
        yield return null;
    }
}

该值在StartCoroutine(changeValueOverTime(5, 1, 3)); 秒内从5更改为1。如果3设置为Time.timeScale1,则无关紧要。