Unity——协程的基本用法


using UnityEngine;
using System.Collections;
 
//测试脚本,随意挂载,运行即可打印
public class Coroutine : MonoBehaviour 
{
    void Start()
    {
        //StartCoroutine(Test());
        StartCoroutine(TestStartCoroutine());
    }
    
    IEnumerator TestNull()
    {
        //return null和return 任意一个数字的操作结果是一样的
        yield return null;
        Debug.Log("等下一帧中的update函数执行完后继续执行");
    }
    IEnumerator TestWaitForSeconds()
    {
        //等待3秒,一段指定的时间时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
        yield return new WaitForSeconds(3);
        Debug.Log("距离程序启动已经过了3s");
    }
    IEnumerator TestStartCoroutine()
    {
        //等待帧结束,等待所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
        //yield return new WaitForEndOfFrame();
        //等待某个协程(方法)执行完毕后再执行后续代码,比如要执行完TestWaitForSeconds方法以后再执行TestStartCoroutin
        yield return StartCoroutine(TestWaitForSeconds());
        Debug.Log("我在--“距离程序启动已经过了3s”--后被打印");
    }
    #region yiele return 介绍
   /*
    *yield return null; // 下一帧再执行后续代码(通常用于循环语句中)
    *yield return 0; //下一帧再执行后续代码
    *yield return 6;//(任意数字) 下一帧再执行后续代码
    *yield break; //直接结束该协程的后续操作
    *yield return asyncOperation;//等异步操作结束后再执行后续代码
    *yield return StartCoroution(某个协程);//等待某个协程执行完毕后再执行后续代码
    *yield return WWW();//等待WWW操作完成后再执行后续代码
    *yield return new WaitForEndOfFrame();//等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
    *yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
    *yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响);
    *yield return WaitForFixedUpdate();//等待下一次FixedUpdate开始时再执行后续代码
    *yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候....如:yield return new WaitUntil(() => frame >= 10);
    *yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候.... 如:yield return new WaitWhile(() => frame < 10);
    */
    #endregion
}

协程的开启

开启协程需要使用StartCoroutine()方法:

开启无参数的协程:
StartCoroutine(协程名());或StartCoroutine("协程名");

开启单参数的协程:
StartCoroutine(协程名(参数));或StartCoroutine("协程名",参数);

开启多参数的协程:
StartCoroutine(协程名(参数1,......));

void StartCoroutine()//开启协程的函数
{
    IEnumerator coroutine = Test(5, 6);
    StartCoroutine(coroutine);
}
 public IEnumerator Test(int a, int b)//协程
 {
     //等待帧画面渲染结束
     yield return new WaitForEndOfFrame();
     a=2;
     b=3;
}

用“协程名”启动的方式不允许传入 一个以上的参数

协程的结束

结束协程有两种情况:

当协程的方法体执行完毕将会自动结束

调用StopCoroutine();方法中止协程执行

中止协程的几种情况:

中止所有协程:
StopAllCoroutines();

使用对象实例中止指定协程

void Start()
{
    c = StartCoroutine(CountSeconds());        
}
void Update()
{
    if (Input.GetKeyDown(KeyCode.J))
    {
        StopCoroutine(c);
    }
}

使用字符串中止指定协程

StartCoroutine("协程名");
StopCoroutine("协程名");

只有以协程名字符串启动的协程可以用此方法中止
既:StartCoroutine(“协程名”);或StartCoroutine(“协程名”,参数);

允许使用**StopCoroutine(“协程名”);**中止协程

不允许使用直接调用协程方法的方式中止指定协程
既:**StopCoroutine(协程名([参数]));**不被允许

yield 协程回复条件语句

 生命周期图
在这里插入图片描述

 

  • 2
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论 2

打赏作者

让我们一起飞翔

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值