2 回答

TA貢獻1825條經驗 獲得超6個贊
看起來你的startingColour.a
值總是比這個大,0
所以while
循環永遠不會結束,你的協程會永遠運行。如果沒有看到其余代碼,很難判斷。
因此,如果你第二次啟動它,你現在有兩個例程并行運行 => 現在每一幀你將 alpha 減少兩倍..然后三倍..等等,并且它也不會在第一次調用之前等待 3 秒例程已經在運行while
循環,因此它們會繼續減少 alpha。
當開始新的例程時,您可以使用StopAllCoroutines
或StopCoroutine
來中斷任何仍在運行的例程。但這實際上更像是一種骯臟的解決方法。
我寧愿解決實際問題并確保您的 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;
}
這更加靈活,您可以使用您喜歡的任何簡單數學添加緩入和緩出。

TA貢獻1871條經驗 獲得超8個贊
好吧,我已經解決了這個問題,這完全是我的錯。
我意識到我的另一個協程正在干擾當前的協程,所以這就是為什么StopCoroutine()
添加淡入淡出檢查不起作用。
抱歉,大家沒有將其包含在我的問題帖子中,您可能能夠更有效地幫助我。
因此,對于將來遇到奇怪的例行行為的任何人,請確保兩個協程不會互相干擾。
- 2 回答
- 0 關注
- 145 瀏覽
添加回答
舉報