簡體   English   中英

隨着時間的推移在兩個值之間變小

[英]Lerp between two values over time

我正在嘗試通過時間值減少浮點數,我正在使用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”

謝謝。

我正在使用Unity並停止時間Time.timeScale = 0f; 因此不能使用Time.deltaTime ,而在while循環中使用'Time.realtimeSinceStartup'。

您無需為此使用Time.realtimeSinceStartup 的確,將Time.timeScale設置為0會使Time.deltaTime每幀返回0

這就是為什么在Unity 4.5中添加了Time.unscaledDeltaTime來解決該問題的原因。 只需將Time.deltaTime替換為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));

該值在3秒鍾內從5變為1 Time.timeScale設置為1還是0都沒有關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM