Я использую 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 включает значения от минимума домаксимальные веса, определенные в модели.