[英]Ending a coroutine while running in unity3d
我試圖用按鈕啟動和結束協程。 我可以啟動協程,但是無法停止,如果在第一次啟動協程后再次單擊該按鈕,它將再次重新啟動,並且滑塊值會上升。
這是我的代碼
public void LoopButton(){
if (lb == 1){
StopCoroutine (AutoLoop());
tb--;
} else {
StartCoroutine (AutoLoop ());
tb++;
}
}
IEnumerator AutoLoop(){
slider.value = slider.minValue;
while(slider.value < slider.maxValue){
slider.value++;
yield return new WaitForSeconds(0.5f);
}
StartCoroutine (AutoLoop());
}
你需要調用StopCoroutine
用相同的參考Coroutine
由歸國StartCoroutine
,就像這樣:
private Coroutine loopCoroutine;
public void LoopButton()
{
if (lb == 1)
{
StopCoroutine(loopCoroutine);
tb--;
}
else
{
loopCoroutine = StartCoroutine(AutoLoop());
tb++;
}
}
若要使用此方法,請將AutoLoop
方法更改為使用while循環,而不是在方法結尾處啟動另一個AutoLoop
協程。 否則,您將無法停止在AutoLoop
末尾啟動的新協程。
IEnumerator AutoLoop()
{
while(true)
{
slider.value = slider.minValue;
while (slider.value < slider.maxValue)
{
slider.value++;
yield return new WaitForSeconds(0.5f);
}
}
}
對於另一個解決方案,正如另一個用戶所評論的,也可以通過布爾標志來停止協程:
private bool stopLoop;
public void LoopButton()
{
if (lb == 1)
{
stopLoop = true;
tb--;
}
else
{
stopLoop = false;
StartCoroutine (AutoLoop ());
tb++;
}
}
IEnumerator AutoLoop()
{
slider.value = slider.minValue;
while (slider.value < slider.maxValue && !stopLoop)
{
slider.value++;
yield return new WaitForSeconds(0.5f);
}
if (!stopLoop)
{
StartCoroutine(AutoLoop());
}
}
但是,使用Unity的StopCoroutine
優於使用boolean標志來提高可讀性和整潔度。
您可以使用StopCoroutine
。
此處提供更多信息: https : //docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html
使用字符串作為協程名稱。 像這樣:
public void LoopButton(){
if (lb == 1){
StopCoroutine ("AutoLoop");
tb--;
} else {
StartCoroutine ("AutoLoop");
tb++;
}
}
IEnumerator AutoLoop(){
slider.value = slider.minValue;
while(slider.value < slider.maxValue){
slider.value++;
yield return new WaitForSeconds(0.5f);
}
StartCoroutine ("AutoLoop");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.