第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Unity 協(xié)程中的時間錯誤

Unity 協(xié)程中的時間錯誤

C#
白衣非少年 2023-12-17 21:10:58
我在動畫工作中使用協(xié)程。我必須確保時機是完美的。例如,我需要加班增加價值。我設(shè)置了 time 和 stepCount 來執(zhí)行此操作。我的代碼如下所示: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);}因此,當(dāng)我設(shè)置 time=1f 和 stepCount=1 時,開始和結(jié)束打印之間的實時時間為 1 秒。 但是當(dāng)我將 stepCount 增加到 100 或更多保持 time=1 時,則實時時間超過 1 秒。 大約 ~1.67f所以我有一個問題:我怎樣才能使用具有特定 stepCount 的協(xié)程并擁有完美的時序?我使用 stepCount 在 blenshapes、著色器變量(如不透明度)上實現(xiàn)更平滑的過渡。并且必須使用 stepCount>=100。
查看完整描述

1 回答

?
一只名叫tom的貓

TA貢獻1906條經(jīng)驗 獲得超3個贊

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

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

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

yield?return?new?WaitForSeconds(XY);

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

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

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

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


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

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

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

既然是一個,而且看起來你真正想要的是一個平穩(wěn)的過渡,你可以簡單地做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;

應(yīng)向上或向下舍入到 的下一個完整步驟。deltaValue


另請注意,在較新的 Unity?版本中,不再像以前版本那樣自動限制在范圍內(nèi)。SetBlendShapeWeight[0; 100]

不過,大多數(shù) 3D 建模程序都會導(dǎo)出具有 Unity 中范圍的模型[0;100]

BlendShape 權(quán)重范圍包括模型中定義的最小權(quán)重和最大權(quán)重之間的值。


查看完整回答
反對 回復(fù) 2023-12-17
  • 1 回答
  • 0 關(guān)注
  • 292 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號