亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Unity 協程中的時間錯誤

Unity 協程中的時間錯誤

C#
白衣非少年 2023-12-17 21:10:58
我在動畫工作中使用協程。我必須確保時機是完美的。例如,我需要加班增加價值。我設置了 time 和 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 或更多保持 time=1 時,則實時時間超過 1 秒。 大約 ~1.67f所以我有一個問題:我怎樣才能使用具有特定 stepCount 的協程并擁有完美的時序?我使用 stepCount 在 blenshapes、著色器變量(如不透明度)上實現更平滑的過渡。并且必須使用 stepCount>=100。
查看完整描述

1 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

我使用 stepCount 在 blenshapes、著色器變量(如不透明度)上實現更平滑的過渡。并且必須使用 stepCount>=100。

這些步驟都將在第二秒發生......但是1

您的代碼以一定的最佳幀速率運行(在 PC 上和編輯器中大多更高),這導致“標準”大約在兩幀之間!60 f/sTime.deltaTime0.017 seconds

yield?return?new?WaitForSeconds(XY);

或者一般來說,任何使用的東西都會至少等待一幀yield

因此,當然,一旦變得比實際可能的幀速率和兩幀之間的實時時間更小,您的功能就會中斷。特別是例如,當您說您希望每秒執行幾次時。deltaTime>=100

比幀速率更頻繁地更新值也是沒有意義的,因為用戶不會比實際渲染幀更快地注意到任何更改。

此外,可能是一個性能密集型調用(老實說不知道),因此它也可能減慢執行速度,從而導致額外的延遲。SetBlendShapeWeight


如何使用具有特定 stepCount 的協程并擁有完美的時序

超過一定限度,你就做不到。

但是,為什么您需要/想要使用固定步驟呢?value

既然是一個,而且看起來你真正想要的是一個平穩的過渡,你可以簡單地做valuefloat

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 權重范圍包括模型中定義的最小權重和最大權重之間的值。


查看完整回答
反對 回復 2023-12-17
  • 1 回答
  • 0 關注
  • 261 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號