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

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

團結| 每次執行后協程加速

團結| 每次執行后協程加速

C#
MM們 2023-09-24 11:19:25
我的協程在玩家死后淡出他們,// Fade out ragdollIEnumerator RagdollFade(){    yield return new WaitForSeconds(3f);    while (startingColour.a > 0.0f)    {        headSR.color = new Color(headSR.color.r, headSR.color.g, headSR.color.b, headSR.color.a - (Time.deltaTime / 1.5f));        bodySR.color = new Color(bodySR.color.r, bodySR.color.g, bodySR.color.b, bodySR.color.a - (Time.deltaTime / 1.5f));        leftArmSR.color = new Color(leftArmSR.color.r, leftArmSR.color.g, leftArmSR.color.b, leftArmSR.color.a - (Time.deltaTime / 1.5f));        rightArmSR.color = new Color(rightArmSR.color.r, rightArmSR.color.g, rightArmSR.color.b, rightArmSR.color.a - (Time.deltaTime / 1.5f));        leftLegSR.color = new Color(leftLegSR.color.r, leftLegSR.color.g, leftLegSR.color.b, leftLegSR.color.a - (Time.deltaTime / 1.5f));        rightLegSR.color = new Color(rightLegSR.color.r, rightLegSR.color.g, rightLegSR.color.b, rightLegSR.color.a - (Time.deltaTime / 1.5f));        yield return null;    }}每次執行后都會加速。例如,第一次調用協程時一切正常,3 秒后播放器淡出。然而,下一次調用時,在淡入淡出之前不要過去3秒,下一次甚至更短的時間,等等。startingColour在 Start() 函數中設置。
查看完整描述

2 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

看起來你的startingColour.a總是比這個大,0所以while循環永遠不會結束,你的協程會永遠運行。如果沒有看到其余代碼,很難判斷。

因此,如果你第二次啟動它,你現在有兩個例程并行運行 => 現在每一幀你將 alpha 減少兩倍..然后三倍..等等,并且它也不會在第一次調用之前等待 3 秒例程已經在運行while循環,因此它們會繼續減少 alpha。


當開始新的例程時,您可以使用StopAllCoroutinesStopCoroutine來中斷任何仍在運行的例程。但這實際上更像是一種骯臟的解決方法。


我寧愿解決實際問題并確保您的 while 循環返回,這目前不太可能發生,因為您似乎沒有startColor.a任何改變。

或者添加一個根本不允許并行例程的標志,例如

private bool isFading;


IEnumerator RagdollFade()

{

? ? if(isFading) yield brake;


? ? // prevents other routines

? ? isFading = true;


? ? ...


? ? // reset the flag once routine is finished

? ? isFading = false;

}

然后我還寧愿建議使用一個單一float值來進行淡入淡出,Color.Lerp例如

private bool isFading;


// you can also use a fixed duration and not pass it as parameter

// but this way you are even more flexible

IEnumerator RagdollFade(float duration)

{

? ? if(isFading) yield brake;


? ? // prevents other routines

? ? isFading = true;


? ? yield return new WaitForSeconds(3f);


? ? // it is more performant to gather all required information beforehand


? ? headStartColor = headSR.color;

? ? bodyStartColor = bodySR.color;

? ? leftArmStartColor = leftArmSR.color;

? ? rightArmStartColor = rightArmSR.color;

? ? leftLegStartColor = leftLegSR.color;

? ? rightLegStartColor = rightLegSR.color;


? ? headTargetColor = new Color(headStartColor.r, headStartColor.g, headStartColor.b, 0f);

? ? bodyTargetColor = new Color(bodyStartColor.r, bodyStartColor.g, bodyStartColor.b, 0f);

? ? leftArmTargetColor = new Color(leftArmStartColor.r, leftArmStartColor.g, leftArmStartColor.b, 0f);

? ? rightArmTargetColor = new Color(rightArmStartColor.r, rightArmStartColor.g, rightArmStartColor.b, 0f);

? ? leftLegTargetColor = new Color(leftLegStartColor.r, leftLegStartColor.g, leftLegStartColor.b, 0f);

? ? rightLegTargetColor = new Color(rightLegStartColor.r, rightLegStartColor.g, rightLegStartColor.b, 0f);


? ? var passedTime = 0f;

? ? while (passedTime < duration)

? ? {

? ? ? ? // get the interpolation factor from 0 to 1

? ? ? ? var factor = passedTime / duration;

? ? ? ? // for adding additional ease-in and ease-out

? ? ? ? // factor = Mathf.SmoothStep(0, 1, factor);


? ? ? ? headSR.color = Color.Lerp(headStartColor, headTargetColor, factor);

? ? ? ? bodySR.color = Color.Lerp(bodyStartColor, bodyTargetColor, factor);

? ? ? ? leftArmSR.color = Color.Lerp(leftArmStartColor, leftArmTargetColor, factor);

? ? ? ? rightArmSR.color = Color.Lerp(rightArmStartColor, rightArmTargetColor, factor);

? ? ? ? leftLegSR.color = Color.Lerp(leftLegStartColor, leftLegTargetColor, factor);

? ? ? ? rightLegSR.color = Color.Lerp(rightLegStartColor, rightLegTargetColor, factor);



? ? ? ? // avoid overshooting

? ? ? ? passedTime += Mathf.Min(Time.deltatime, duration - passedTime);

? ? ? ? yield return null;

? ? }


? ? // reset the flag once routine is finished

? ? isFading = false;

}

這更加靈活,您可以使用您喜歡的任何簡單數學添加緩入和緩出。


查看完整回答
反對 回復 2023-09-24
?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

StopCoroutine()在啟動新協程之前嘗試調用。可能您有幾個協程同時工作。



查看完整回答
反對 回復 2023-09-24
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

好吧,我已經解決了這個問題,這完全是我的錯。

我意識到我的另一個協程正在干擾當前的協程,所以這就是為什么StopCoroutine()添加淡入淡出檢查不起作用。

抱歉,大家沒有將其包含在我的問題帖子中,您可能能夠更有效地幫助我。

因此,對于將來遇到奇怪的例行行為的任何人,請確保兩個協程不會互相干擾。


查看完整回答
反對 回復 2023-09-24
  • 2 回答
  • 0 關注
  • 145 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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