1 回答

TA貢獻1906條經驗 獲得超3個贊
我使用 stepCount 在 blenshapes、著色器變量(如不透明度)上實現更平滑的過渡。并且必須使用 stepCount>=100。
這些步驟都將在第二秒發生......但是:1
您的代碼以一定的最佳幀速率運行(在 PC 上和編輯器中大多更高),這導致“標準”大約在兩幀之間!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
value?=?Mathf.Round(value?/?deltaValue))?*?deltaValue;
應向上或向下舍入到 的下一個完整步驟。deltaValue
另請注意,在較新的 Unity?版本中,不再像以前版本那樣自動限制在范圍內。SetBlendShapeWeight
[0; 100]
不過,大多數 3D 建模程序都會導出具有 Unity 中范圍的模型[0;100]
BlendShape 權重范圍包括模型中定義的最小權重和最大權重之間的值。
- 1 回答
- 0 關注
- 261 瀏覽
添加回答
舉報