StopCoroutine tidak berfungsi bahkan StartCoroutine(string), StopCoroutine(string) di unity3d

Saya tidak mengerti alasannya.

Saya sudah membaca banyak dokumen tentang hal itu dan ada banyak komentar tentang itu

StopCoroutine(string) hanya dapat menghentikan coroutine yang dimulai dengan StartCoroutine(string)

kodenya ada di bawah.

Di Kelas CharTouchControl.cpp

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

_CharControl adalah anggota CharTouchControl dan tentu saja _CharControl merujuk pada instance CharControl di bawah.

Dan 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

Ketika m_nUseFever ‹ _nFeverMax benar, saya dapat melihat "Stop!!" catatan,

tapi coroutine tidak berhenti dan menyimulasikan paticle.

adakah yang bisa membantu untuk ini?


person Chickenchaser    schedule 13.11.2013    source sumber
comment
Hanya ingin tahu, mengapa Anda menggunakan StopCoroutine dari dalam coroutine? Gunakan yield break dalam pernyataan if pertama sebagai gantinya.   -  person Jerdak    schedule 13.11.2013
comment
Anda memanggil StopCoroutine, yang mencegah fungsi lainnya (termasuk simulasi partikel) dijalankan. Apa yang ingin Anda capai?   -  person Dan Puzey    schedule 13.11.2013


Jawaban (1)


Seperti yang disebutkan Jerdak, Anda harus menggunakan yield break saat Anda berada di dalam Coroutine. coroutine akan otomatis berhenti ketika blok kodenya selesai. Menggunakan hasil istirahat, harus mengirimkannya ke akhir blok kode.

Selain itu, Anda dapat memodifikasi kode Anda sehingga hanya menjalankan blok kode jika kondisinya benar. Saya telah melakukan ini pada contoh di bawah. Jika kondisinya salah, coroutine hanya akan menunggu akhir frame lalu keluar.

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

EDIT: Dan Puzey menyampaikan poin bagus, Apakah Anda yakin tidak boleh menggunakannya

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

alih-alih? Dari kode Anda sepertinya Anda hanya ingin menjalankan fungsi useFever dalam 10 detik. Jika demikian, Anda harus menjalankannya alih-alih menjalankannya sebagai coroutine, dan useFever seharusnya merupakan fungsi normal.

Sekadar referensi, ada juga CancelInvoke("useFever")

person MichaelTaylor3D    schedule 13.11.2013
comment
Jika kode itu berfungsi sesuai keinginan OP, tidak ada gunanya menjalankannya di coroutine - kode itu akan tetap berjalan sampai selesai dalam satu frame. Selain itu, jarang ada nilai di baris terakhir coroutine yang berupa yield (kecuali jika Anda merangkai coroutine). - person Dan Puzey; 13.11.2013
comment
Saya setuju dengan Anda tetapi dia telah menempatkannya di sana, jadi ketika saya memfaktorkan ulang kodenya, saya pikir dia punya alasannya sendiri. Saya pikir itu karena alasan waktu. Saya tidak berhak memutuskannya - person MichaelTaylor3D; 13.11.2013