MonoBehaviour.StartCoroutine

本文详细介绍了如何使用C#中的StartCoroutine方法启动协程,通过yield语句实现多帧内的行为模拟,包括等待指定时间并打印当前时间的操作。还提供了将协程方法名作为字符串传递的例子,以便于使用StopCoroutine方法停止特定协程。

function StartCoroutine (routine : IEnumerator) : Coroutine

Description

Starts a coroutine.

The execution of a coroutine can be paused at any point using the yield statement. The yield return value specifies when the coroutine is resumed. Coroutines are excellent when modelling behaviour over several frames. Coroutines have virtually no performance overhead. StartCoroutine function always returns immediately, however you can yield the result. This will wait until the coroutine has finished execution.

When using JavaScript it is not necessary to use StartCoroutine, the compiler will do this for you. When writing C# code you must call StartCoroutine.

C#
using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Start() {
        print("Starting " + Time.time);
        StartCoroutine(WaitAndPrint(2.0F));
        print("Before WaitAndPrint Finishes " + Time.time);
    }
    IEnumerator WaitAndPrint(float waitTime) {
        yield return new WaitForSeconds(waitTime);
        print("WaitAndPrint " + Time.time);
    }
}

Another Example:
C#
using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    IEnumerator Start() {
        print("Starting " + Time.time);
        yield return StartCoroutine(WaitAndPrint(2.0F));
        print("Done " + Time.time);
    }
    IEnumerator WaitAndPrint(float waitTime) {
        yield return new WaitForSeconds(waitTime);
        print("WaitAndPrint " + Time.time);
    }
}

function StartCoroutine (methodName : String, value : object = null) : Coroutine

Description

Starts a coroutine named methodName.

In most cases you want to use the StartCoroutine variation above. However StartCoroutine using a string method name allows you to use StopCoroutine with a specific method name. The downside is that the string version has a higher runtime overhead to start the coroutine and you can pass only one parameter

C#
using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    IEnumerator Start() {
        StartCoroutine("DoSomething", 2.0F);
        yield return new WaitForSeconds(1);
        StopCoroutine("DoSomething");
    }
    IEnumerator DoSomething(float someParameter) {
        while (true) {
            print("DoSomething Loop");
            yield return null;
        }
    }
}
StackOverflowException: The requested operation caused a stack overflow. System.String.CreateStringFromEncoding (System.Byte* bytes, System.Int32 byteLength, System.Text.Encoding encoding) (at <58af53cbf2a1404e8a3caa8c7c295fd8>:0) System.Text.Encoding.GetString (System.Byte* bytes, System.Int32 byteCount) (at <58af53cbf2a1404e8a3caa8c7c295fd8>:0) System.Text.Encoding.GetString (System.ReadOnlySpan`1[T] bytes) (at <58af53cbf2a1404e8a3caa8c7c295fd8>:0) System.String.Ctor (System.SByte* value, System.Int32 startIndex, System.Int32 length, System.Text.Encoding enc) (at <58af53cbf2a1404e8a3caa8c7c295fd8>:0) System.String.CreateString (System.SByte* value, System.Int32 startIndex, System.Int32 length, System.Text.Encoding enc) (at <58af53cbf2a1404e8a3caa8c7c295fd8>:0) (wrapper managed-to-managed) System.String..ctor(sbyte*,int,int,System.Text.Encoding) UnityEngine.StackTraceUtility.ExtractStackTrace () (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.DebugLogHandler.LogFormat (UnityEngine.LogType logType, UnityEngine.Object context, System.String format, System.Object[] args) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.Logger.Log (UnityEngine.LogType logType, System.Object message) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.Debug.LogWarning (System.Object message) (at <8451905c249043c4aa4b4040ae1f0571>:0) AIManager.发送消息给AI (System.String query, System.Collections.Generic.Dictionary`2[TKey,TValue] inputs) (at Assets/AIManager.cs:274) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:106) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at <8451905c249043c4aa4b4040ae1f0571>:0) 地块生成系统+<请求生成新地块>d__7.MoveNext () (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at <8451905c249043c4aa4b4040ae1f0571>:0) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) <请求生成新地块>d__7:MoveNext() (at Assets/d地图,之类的/地块生成.cs:118) UnityEngine.MonoBehavio<message truncated> TLS Allocator ALLOC_TEMP_TLS, underlying allocator ALLOC_TEMP_MAIN has unfreed allocations, size 116
最新发布
08-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值