📜  Unity协程(1)

📅  最后修改于: 2023-12-03 15:05:45.557000             🧑  作者: Mango

Unity协程

Unity协程(Coroutine)是Unity引擎提供的一种特殊的函数,可以在程序运行时暂停和恢复执行,类似于多线程编程中的线程中断和恢复。协程使得开发者能够方便地编写并发任务,例如控制对象的动画或者网络通信等。

创建协程

在Unity中创建协程非常简单,只需在代码中使用yield return语句即可。下面是一个简单的例子:

IEnumerator MyCoroutine()
{
    // 等待1秒
    yield return new WaitForSeconds(1);

    // 在等待1秒后执行这句话
    Debug.Log("Hello World");
}

在游戏对象中调用这个协程:

StartCoroutine(MyCoroutine());

协程在StartCoroutine()函数调用时开始执行,遇到yield return语句后,协程对象将进入等待状态,等待指定的时间。在等待结束后,协程将继续执行yield语句后的代码。

协程的返回值

协程可以返回一个IEnumerator类型的对象,可以用于实现异步编程。在协程中,可以使用yield return语句返回一个IEnumerator对象,然后在外部使用StartCoroutine()函数启动这个协程。下面是一个例子:

IEnumerator LoadAsset()
{
    // 进行异步加载
    var request = AssetBundle.LoadFromFileAsync("AssetBundleName");

    // 等待异步加载完成
    yield return request;

    // 加载完成后回调
    Debug.Log(request.assetBundle);
}

// 在其他协程中启动这个协程
StartCoroutine(LoadAsset());
协程的使用

下面是一些协程的常见用法:

延迟等待

可以使用yield return new WaitForSeconds()语句延迟指定的时间,例如:

IEnumerator Delay()
{
    Debug.Log("Start Delay");

    // 等待2秒
    yield return new WaitForSeconds(2);

    Debug.Log("End Delay");
}
等待帧结束

使用yield return new WaitForEndOfFrame()等待当前帧结束,例如:

IEnumerator WaitForFrameEnd()
{
    Debug.Log("Start WaitForFrameEnd");

    // 等待帧结束
    yield return new WaitForEndOfFrame();

    Debug.Log("End WaitForFrameEnd");
}
循环等待

可以使用循环结构来产生循环等待,例如:

IEnumerator Loop()
{
    Debug.Log("Start Loop");

    for (int i = 0; i < 10; i++)
    {
        // 等待1秒
        yield return new WaitForSeconds(1);

        Debug.Log($"Loop {i + 1} ....");
    }

    Debug.Log("End Loop");
}
协程的停止和恢复

可以使用StopCoroutine()函数停止协程的执行,使用StartCoroutine()函数重新启动协程的执行。例如:

IEnumerator MyCoroutine()
{
    Debug.Log("Start MyCoroutine");

    // 等待2秒
    yield return new WaitForSeconds(2);

    Debug.Log("End MyCoroutine");
}

// 启动协程
StartCoroutine(MyCoroutine());

// 停止协程
StopCoroutine(MyCoroutine());

// 重新启动协程
StartCoroutine(MyCoroutine());
总结

Unity协程是一种方便的并发编程模式,能够使得代码更加简洁、易于维护。开发者可以使用协程实现延迟等待、循环等待、异步编程等功能,提高了游戏的体验和性能。以上内容只是协程的基本使用,协程还有更多高级用法,开发者可以阅读Unity官方文档进一步了解。