Почему код продолжает работать после 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;
}
}