StopCoroutine在unity3d中甚至没有工作,甚至没有StartCoroutine(string),StopCoroutine(string)

时间:2013-11-13 07:25:26

标签: unity3d coroutine

我无法理解为什么。

我已经阅读了很多关于它的文档,并且有很多评论

StopCoroutine(string)只能用StartCoroutine(字符串)停止协程开始

代码如下。

在Class 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&lt; _nFeverMax是真的,我可以看到“停止!!”日志,

但协程不会停止并模拟圆角。

有人帮忙吗?

1 个答案:

答案 0 :(得分:1)

就像Jerdak提到的那样,当你在Coroutine中时,你应该使用yield break。 协程将在完成代码块后自动停止。使用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

编辑: Dan Puzey提出了一个很好的观点,你确定不应该使用

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

代替?从您的代码看起来您​​只想在10秒内运行useFever函数。如果是这种情况,你应该调用它而不是将其作为协程运行,而useFever应该是一个正常的函数。

仅供参考,还有CancelInvoke("useFever")