Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅在协同程序完成后继续该功能?_C#_Visual Studio_Unity3d_Coroutine - Fatal编程技术网

C# 如何仅在协同程序完成后继续该功能?

C# 如何仅在协同程序完成后继续该功能?,c#,visual-studio,unity3d,coroutine,C#,Visual Studio,Unity3d,Coroutine,输出: 时间1-0 时间3-0 时间2-3.0146 我想要的输出是: 时间1-0 时间2-3 时间3-3 位于的文档中似乎有一个与您尝试执行的操作几乎相同的示例: void Generate() { StartCoroutine(FallDelayCoroutine()); print("time3- " + Time.time); } IEnumerator FallDelayCoroutine() { print("time1- "+ Time.time

输出:

时间1-0
时间3-0
时间2-3.0146

我想要的输出是:

时间1-0
时间2-3
时间3-3

位于的文档中似乎有一个与您尝试执行的操作几乎相同的示例:

void Generate()
{
    StartCoroutine(FallDelayCoroutine());
    print("time3- " + Time.time);
}

IEnumerator FallDelayCoroutine()
{     
    print("time1- "+ Time.time);
    yield return new WaitForSeconds(3f);
    print("time2- " + Time.time);
}
关键点似乎是他们的
Start
例程返回IEnumerator,然后使用
yield return Start例程(WaitAndPrint(2.0F))
强制它在继续之前等待该方法

因此,对你来说,等价物是:

IEnumerator Start()
{
    // - After 0 seconds, prints "Starting 0.0"
    // - After 2 seconds, prints "WaitAndPrint 2.0"
    // - After 2 seconds, prints "Done 2.0"
    print("Starting " + Time.time);

    // Start function WaitAndPrint as a coroutine. And wait until it is completed.
    // the same as yield WaitAndPrint(2.0);
    yield return StartCoroutine(WaitAndPrint(2.0F));
    print("Done " + Time.time);
}

// suspend execution for waitTime seconds
IEnumerator WaitAndPrint(float waitTime)
{
    yield return new WaitForSeconds(waitTime);
    print("WaitAndPrint " + Time.time);
}
位于的文档中似乎有一个与您尝试执行的操作几乎相同的示例:

void Generate()
{
    StartCoroutine(FallDelayCoroutine());
    print("time3- " + Time.time);
}

IEnumerator FallDelayCoroutine()
{     
    print("time1- "+ Time.time);
    yield return new WaitForSeconds(3f);
    print("time2- " + Time.time);
}
关键点似乎是他们的
Start
例程返回IEnumerator,然后使用
yield return Start例程(WaitAndPrint(2.0F))
强制它在继续之前等待该方法

因此,对你来说,等价物是:

IEnumerator Start()
{
    // - After 0 seconds, prints "Starting 0.0"
    // - After 2 seconds, prints "WaitAndPrint 2.0"
    // - After 2 seconds, prints "Done 2.0"
    print("Starting " + Time.time);

    // Start function WaitAndPrint as a coroutine. And wait until it is completed.
    // the same as yield WaitAndPrint(2.0);
    yield return StartCoroutine(WaitAndPrint(2.0F));
    print("Done " + Time.time);
}

// suspend execution for waitTime seconds
IEnumerator WaitAndPrint(float waitTime)
{
    yield return new WaitForSeconds(waitTime);
    print("WaitAndPrint " + Time.time);
}
作为使用两个协同路由的替代方案,您还可以添加一个回调,例如

IEnumerator Generate()
{
    yield return StartCoroutine(FallDelayCoroutine());
    print("time3- " + Time.time);
}
并使用lambda表达式调用它

IEnumerator FallDelayCoroutine(Action whenDone)
{     
    print("time1- "+ Time.time);
    yield return new WaitForSeconds(3f);
    print("time2- " + Time.time);

    whenDone?.Invoke();
}
或者用一种方法

void Generate()
{
    StartCoroutine(FallDelayCoroutine(() => {
        print("time3- " + Time.time);
    }));  
}
作为使用两个协同路由的替代方案,您还可以添加一个回调,例如

IEnumerator Generate()
{
    yield return StartCoroutine(FallDelayCoroutine());
    print("time3- " + Time.time);
}
并使用lambda表达式调用它

IEnumerator FallDelayCoroutine(Action whenDone)
{     
    print("time1- "+ Time.time);
    yield return new WaitForSeconds(3f);
    print("time2- " + Time.time);

    whenDone?.Invoke();
}
或者用一种方法

void Generate()
{
    StartCoroutine(FallDelayCoroutine(() => {
        print("time3- " + Time.time);
    }));  
}

我想这似乎回答了你的问题(尽管我对团结没有经验)。特别是第二个例子似乎正是您想要的…协同程序的要点是它不会这样做。。。我想这似乎回答了你的问题(尽管我对团结没有经验)。特别是第二个例子似乎正是您想要的…协同程序的要点是它不会这样做。。。