Почему код продолжает работать после StopCoroutine()?

Мигание реализовал через 2 кнопки: 1 темная кнопка, 2 светлая кнопка. Первая .SetActive(false), вторая .SetActive(true) и так чередуется...

После StopCoroutine(myFunc(btn1, btn2)) останавливается мигание и снова продолжается. Если передать название функции как строку StopCoroutine("myFunc"), то всё работает, но благодаря этому мне придется создавать еще функции: myFunc2, myFunc3... потому что кнопок больше 2-х, не хочется дублировать.

Как остановить мигание?
Как написать универсальную функцию для корутинов?

// class Btns
static public Btns S;
private IEnumerator _coroutine;

void Awake () {
 S = this;
}

public void startFI () {
  _coroutine = BlinkindRun (btn1, btn2);
// 1. пробовал _coroutine = StartCoroutine ( BlinkindRun (btn1, btn2) );
// 2. пробовал StartCoroutine ("_coroutine");
  StartCoroutine (_coroutine);
}

public void stopFI () {
 // 3. пробовал _coroutine = BlinkindRun (btn1, btn2);
 // 4. пробовал StopCoroutine ("_coroutine");
 // 5. пробовал StopCoroutine ("BlinkindRun");
  StopCoroutine (_coroutine);
}

private IEnumerator BlinkindRun (GameObject offGO, GameObject onGO) {
        while (true) {
            blinkBtn(offGO, onGO);
            yield return new WaitForSeconds (1f);

            blinkBtn(onGO, offGO);
            yield return new WaitForSeconds (1f);
        }
    }

public void blinkBtn (GameObject offGO, GameObject onGO, bool blinkGO = false) {
        offGO.SetActive (false);
        onGO.SetActive (true);
    }


// class B
private void Awake () {
        UIButton1.onClick.AddListener (onStep1Touch);
        UIButton2.onClick.AddListener (onStep2Touch);
}

private void onStep1Touch () {
  Btns.S.startFI ();
}

private void onStep2Touch () {
  Btns.S.stopFI ();
}

Ответы (2 шт):

Автор решения: Василий Гайсен

Попробуйте StartCoroutine(BlinkindRun(сюда передавайте необходимые параметры));, так как эта перегрузка выполняет метод по-другому. Также немного смущает while (true). Попробуйте вместо true написать какую-нибудь переменную bool, а затем, когда нужно остановить корутин, ставить этой переменной значение false

→ Ссылка
Автор решения: Арман

Решение

Попробуйте вот так:

private IEnumerator _coroutine()
{
    //тут то что должен выполняться в короутине
}

Запускать и остановить можете так:

StartCoroutine(_coroutine());
StopCoroutine(_coroutine());

Другой метод

Если хотите просто делать мигание кнопки можете вот так:

public Button JustAButton;

private void Update()
{
    float time = 1.0f
    float progress = Mathf.PingPong(0, time) * Time.deltaTime;
    if(progress == 0)
    {
        JustAButton.GetComponent<Image>().color = Color.White;
    }
    else if(progress == 1)
    {
        JustAButton.GetComponent<Image>().color = Color.Black;
    }
}
→ Ссылка