Неправильное время внутри сопрограммы Unity - PullRequest
0 голосов
/ 22 сентября 2019

Я использую сопрограммы для моей анимационной работы.И я должен быть уверен, что время идеально.Например, мне нужно увеличить значение overtime.I установить время и stepCount, чтобы выполнить это.Мой код выглядит так:

IEnumerator ScaleDown(float time)
{
    print(Time.time);
    float value = 0f;
    float deltaValue = 1 / (stepCount*time);
    float deltaTime = 1/stepCount;
    while (value < 1f)
    {
        value += deltaValue;
        meshRenderer.SetBlendShapeWeight(1, value * 100f);
        yield return new WaitForSeconds(deltaTime);
    }
    print(Time.time);
}

Поэтому, когда я устанавливаю time = 1f и stepCount = 1, реальное время между началом и окончанием печати составляет 1 секунду.Но когда я увеличиваю stepCount до 100 или более, время удержания = 1, тогда реальное время составляет более 1 секунды.Кое-что о ~ 1.67f

Итак, у меня вопрос: как я могу использовать сопрограммы с определенным stepCount и иметь идеальное время?Я использую stepCount для более плавного перехода на blenshapes, переменных шейдера, таких как opacity.И должен использовать stepCount> = 100.

1 Ответ

0 голосов
/ 22 сентября 2019

Я использую stepCount для более плавного перехода на blenshapes, переменных шейдера, таких как opacity.И должен использовать stepCount> = 100.

Все эти шаги должны выполняться за 1 секунду ... , но :

Ваш код работает с определенной частота кадров оптимально около 60 f/s (на ПК и в редакторе в основном выше), что приводит к "стандартному" Time.deltaTime примерно 0.017 seconds между двумя кадрами!

yield return new WaitForSeconds(XY);

или вообще что-нибудь с использованием yield ждет хотя бы одного кадра !

Так что, конечно, ваша функциональность нарушается, как только deltaTime становится меньше, чемфактическая возможная частота кадров и реальное время между двумя кадрами.Особенно, например, когда вы говорите, что хотите, чтобы это выполнялось >=100 раз в секунду.

Также не имеет смысла обновлять значение чаще, чем частота кадров, так как пользователь никогда не заметит никаких изменений быстрее.затем кадры фактически визуализируются.

Кроме того, SetBlendShapeWeight может быть вызовом с высокой производительностью (не знаю, если честно), так что это может также замедлить выполнение, вызывая дополнительную задержку.


Как я могу использовать сопрограммы с определенным stepCount и иметь идеальное время

За пределами определенного предела вы просто не можете.

Но зачем вам / нужно использовать фиксированные шаги для value на всех ?

Так как value - это float, и то, что вам действительно нужно, это довольно плавный переход, который вы могли бы просто сделать

IEnumerator ScaleDown(float duration)
{
    print(Time.time);
    timePassed = 0f;
    do
    {
        // a linear interpolated value between 0 and 1
        var value = timePassed / duration;
        // optionaly you could even add some ease-in and ease-out
        //value = SmoothStep(0, 1, value);

        meshRenderer.SetBlendShapeWeight(1, value * 100f);

        // increase by the time passed since last frame
        // to avoid overshooting use Mathf.Min with the remaining difference
        // between duration and passedTime
        timePassed += Mathf.Min(duration - timePassed, Time.deltaTime);
        yield return null;
    } while (timePassed < duration);
    print(Time.time);
}

Если вы все еще хотите подделать его другим способомокругляя и обновляя его фиксированными шагами для stepCount <частоты кадров, вы можете просто округлить плавно переведенные значения до этого значения, например, </p>

value = Mathf.Round(value / deltaValue)) * deltaValue;

, которое должно округляться вверх или вниз до следующего полного шага deltaValue.


Также обратите внимание, что в более новых версиях Unity SetBlendShapeWeight равен , а не автоматически ограничивается диапазоном [0; 100] больше, чем он был в предыдущие версии .

Хотя большинство программ трехмерного моделирования экспортируют модели с диапазоном [0;100] в Unity

Весовой диапазон BlendShape включает значения от минимума домаксимальные веса, определенные в модели.

...