Вам необходимо позвонить 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
предпочтительнее, чем использование логического флага для удобства чтения и очистки.