Unity 6.3
0 онлайн 76 гостей 3 в системе
Вход

MonoBehaviour.StartCoroutine

Declaration

public Coroutine StartCoroutine(IEnumerator routine);

Описание

Начинает работу.

Выполнение сопутствующей программы может быть приостановлено в любой момент с помощью yield заявление. Когда yield При использовании инструкции, сопроцесс приостанавливает выполнение и автоматически возобновляет его на следующем кадре. Для получения дополнительной информации см. Запись и выполнение сопроцессов в руководстве.

Корутин полезны для моделирования поведения в нескольких кадрах. StartCoroutine метод возвращается на первом yield return, однако вы также можете yield результат, который ожидает, пока сопутствующая программа не закончит выполнение. Нет гарантии, что сопутствующие программы закончатся в том же порядке, в котором они начались, даже если они закончатся в том же кадре.

Выход любого типа, включая null, приводит к тому, что выполнение возвращается на более поздний кадр, если только не остановить или не завершить сопутствующую программу. Если сопутствующая программа выполняется до завершения без отказа (например, если yield заявление недоступно), StartCoroutine возвращений null.

Чтобы остановить работу, используйте MonoBehaviour.StopCoroutine или MonoBehaviour.StopAllCoroutines.

Дополнительные ресурсы: Coroutine, YieldInstruction

// This example invokes a coroutine and continues executing the function in parallel.

using UnityEngine; using System.Collections;

public class ExampleClass : MonoBehaviour {

private IEnumerator coroutine;

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

// Start function WaitAndPrint as a coroutine.

coroutine = WaitAndPrint(2.0f); StartCoroutine(coroutine);

print("Before WaitAndPrint Finishes " + Time.time); }

// every 2 seconds perform the print() private IEnumerator WaitAndPrint(float waitTime) { while (true) { yield return new WaitForSeconds(waitTime); print("WaitAndPrint " + Time.time); } } }
// This example invokes a coroutine and waits until it is completed.

using UnityEngine; using System.Collections;

public class ExampleClass : MonoBehaviour { 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 return WaitAndPrint(2.0f); 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); } }

Declaration

public Coroutine StartCoroutine(string methodName, object value = null);

Описание

Запускает сопроцесс с именем methodName.

В большинстве случаев предпочтительнее использовать версию StartCoroutine, которая принимает параметр IEnumerator, потому что она имеет меньшую нагрузку на время выполнения. Однако StartCoroutine со строкой methodName позволяет использовать MonoBehaviour.StopCoroutine с конкретным именем метода.

// In this example we show how to invoke a coroutine using a string name and stop it.

using UnityEngine; using System.Collections;

public class ExampleClass : MonoBehaviour { IEnumerator Start() { StartCoroutine(nameof(DoSomething), 2.0f); yield return new WaitForSeconds(1); StopCoroutine(nameof(DoSomething)); }

IEnumerator DoSomething(float someParameter) { while (true) { print("DoSomething Loop");

// Yield execution of this coroutine and return to the main loop until next frame yield return null; } } }

Коррутина может запустить другую коррутину, и они могут взаимодействовать несколькими способами, включая параллельное выполнение обеих коррутин. В качестве альтернативы, одна коррутина может остановить другую, продолжая работу самостоятельно. В следующем примере одна коррутина останавливается, когда она запускает другую. Когда вторая коррутина заканчивается, она перезапускает первую.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ExampleClass : MonoBehaviour { void Start() { StartCoroutine(coroutineA()); }

IEnumerator coroutineA() { // wait for 1 second Debug.Log("coroutineA created"); yield return new WaitForSeconds(1.0f); yield return StartCoroutine(coroutineB()); Debug.Log("coroutineA running again"); }

IEnumerator coroutineB() { Debug.Log("coroutineB created"); yield return new WaitForSeconds(2.5f); Debug.Log("coroutineB enables coroutineA to run"); } }