0

我不明白为什么。

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

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 为真时,我可以看到“停止!!” 日志,

但协程不会停止并模拟颗粒。

有人帮忙吗?

4

1 回答 1

1

正如 Jerdak 提到的,当你在协程中时,你应该使用 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")

于 2013-11-13T14:33:28.343 回答