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

Kev*_*ths 2 c# floating-point while-loop unity-game-engine

我正在尝试将浮点数减少一个时间值,我正在使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

对不起,我只是无法获得'volumePercentage'

谢谢.

Pro*_*mer 5

我正在使用Unity并停止时间,Time.timeScale = 0f;所以不能 Time.deltaTime在while循环中使用'Time.realtimeSinceStartup'.

你不需要使用Time.realtimeSinceStartup它.确实设置Time.timeScale0使得 每帧Time.deltaTime返回0.

这就是为什么Time.unscaledDeltaTimeUnity 4.5中添加了解决这个问题的原因.只需更换Time.deltaTimeTime.unscaledDeltaTime.您可以使用事件if (Time.timeScale == 0)自动决定是否使用Time.unscaledDeltaTimeTime.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

StartCoroutine(changeValueOverTime(5, 1, 3));
Run Code Online (Sandbox Code Playgroud)

从值变化513秒.如果Time.timeScale设置为1或无关紧要0.