【问题标题】:How to stop co-routine?如何停止协程?
【发布时间】:2014-10-01 23:09:46
【问题描述】:

当两个协程运行时,如何停止第一个协程?

GLOBALS.stableTime = 5;

IEnumerator StableWaittingTime ()
{
        yield return new WaitForSeconds (1f);
        if (GLOBALS.stableTime == 0) {
                GameManager.instance.LevelFaildMethod ();
        } else {
                GameManager.instance.stableWaittingTime.text = GLOBALS.stableTime.ToString ();
                GLOBALS.stableTime--;
                StartCoroutine ("StableWaittingTime");
        }
}

【问题讨论】:

    标签: c# unity3d coroutine


    【解决方案1】:

    有三种方法可以停止协程。

    1. 首先是调用StopAllCoroutines(),这显然会停止所有正在运行的协程。
    2. 第二种是调用StopCoroutine(coroutine),其中coroutine是给你的IEnumerator的变量名。
    3. 第三个是在协程中执行yield break。

    值得注意的是,StopAllCoroutines 和 StopCoroutine 都只能在协程到达 yield return * 时停止协程。

    因此,如果您有两个同名的协程,并且想要停止正在执行的协程,请执行 yield break。 有趣的是,如果您想停止除正在执行的协程之外的所有其他协程,您可以在该协程中调用 StopCoroutines()。

    【讨论】:

    • Thnx Impler ,但同时两个协同程序都在运行,我想在第二个协同程序在第一个协同程序之前启动时,我想停止它怎么可能你有任何想法?
    • 这有点难以理解,但我认为你的意思是首先你启动了一个协程,当你启动第二个协程时,你想停止第一个协程,这是正确的吗?
    • 是的,你的理解绝对是正确的,因为我想同时处理 4-5 个协同程序,所以你能帮我解决我的问题吗?
    • 我不使用不同的协同程序,我对所有人使用相同的协同程序。
    • 另外,您可以将控制标志传递给协程(带有 bool 成员的包装类)。从主循环中提升这个标志并在协程循环中检查这个标志,并在标志被提升时执行 yield break。
    【解决方案2】:

    @Imapler 答案几乎就是您所需要的。我只想补充一点,MonoBehaviour 的 StopCoroutine 方法被重载并且有 3 种类型的参数,所以可以停止许多同名的协程。 对于您的需要,只需使用 yield break;像这样:

    void Start () 
    {
        StartCoroutine (StableWaittingTime ());
    }
    
    IEnumerator StableWaittingTime ()
    {
        yield return new WaitForSeconds (1f);
        if (false) 
        {
            // do something
        } 
        else 
        {
            // do something
            StartCoroutine (StableWaittingTime ());
            yield break;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多