StopCoroutine не работает, даже StartCoroutine (строка), StopCoroutine (строка) в unity3d

Я не могу понять, почему.

Я уже прочитал много документов об этом, и есть много комментариев, которые

StopCoroutine(string) может остановить запуск сопрограммы только с помощью StartCoroutine(string)

код ниже.

В классе CharTouchControl.cpp

if( Input.GetKeyDown( KeyCode.Q ) )
{
    _CharControl.StartCoroutine("useFever", 10);
}

_CharControl является членом CharTouchControl и, конечно же, _CharControl ссылается на экземпляр CharControl ниже.

И InClass CharControl

public IEnumerator useFever(float _duration = 10)
{
    if( m_nUseFever < _nFeverMax )
    {
        Debug.Log("Stop!!");
        StopCoroutine("useFever");
        yield return new WaitForEndOfFrame();
    }

    m_fgCharState = CharState._FEVER;

    // fever particle
    m_psFeverPaticle.Simulate(4);

    yield return new WaitForEndOfFrame();
} // end of useFever

Когда m_nUseFever ‹ _nFeverMax истинно, я вижу "Стоп!!" журнал,

но сопрограмма не останавливается и не имитирует частицы.

кто-нибудь поможет в этом?


person Chickenchaser    schedule 13.11.2013    source источник
comment
Просто из любопытства, почему вы используете StopCoroutine внутри сопрограммы? Вместо этого используйте yield break в первом операторе if.   -  person Jerdak    schedule 13.11.2013
comment
Вы вызываете StopCoroutine, что предотвращает выполнение остальной части функции (включая симуляцию частиц). Чего вы пытаетесь достичь?   -  person Dan Puzey    schedule 13.11.2013


Ответы (1)


Как упомянул Джердак, вы должны использовать yield break, когда находитесь внутри Coroutine. сопрограмма автоматически остановится, когда завершит свой блок кода. Используя yield break, следует отправить его в конец блока кода.

Кроме того, вы можете изменить свой код так, чтобы он запускал блок кода только в том случае, если условие истинно. Я сделал это в примере ниже. Если условие ложно, сопрограмма просто дождется конца кадра и затем выйдет.

public IEnumerator useFever()
{
    if( m_nUseFever > _nFeverMax )
    {
        m_fgCharState = CharState._FEVER;

        // fever particle
        m_psFeverPaticle.Simulate(4);
    }

    yield return new WaitForEndOfFrame();        
} //Coroutine automatically exits here

РЕДАКТИРОВАТЬ: Дэн Пьюзи поднял хороший вопрос: вы уверены, что не должны использовать

Invoke("useFever",10) or InvokeRepeating ("useFever",10,1)

вместо? Судя по вашему коду, вы просто хотите запустить функцию useFever за 10 секунд. Если это так, вы должны вызывать его, а не запускать как сопрограмму, а useFever должна быть нормальной функцией.

Просто для справки, есть еще CancelInvoke("useFever")

person MichaelTaylor3D    schedule 13.11.2013
comment
Если этот код работает так, как задумал OP, нет смысла запускать его в сопрограмме - он все равно будет завершен в одном кадре. Кроме того, в последней строке сопрограммы редко бывает значение yield (если только вы не связываете сопрограммы в цепочку). - person Dan Puzey; 13.11.2013
comment
Я согласен с вами, но он поместил это туда, поэтому, когда я рефакторил его код, я понял, что у него были свои причины. Я полагал, что это было из-за временных соображений. Не мне решать - person MichaelTaylor3D; 13.11.2013