我无法理解为什么。
我已经阅读了很多关于它的文档,并且有很多评论
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是真的,我可以看到“停止!!”日志,
但协程不会停止并模拟圆角。
有人帮忙吗?
答案 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")