unity学习笔记 Unity协程实际作用【转载】

作者 Initial_Dream
原文链接 https://www.cnblogs.com/InitialD/p/7348875.html
最近在学习uinty,用到了协程这个东西。网上查阅了很多资料,介绍的都十分复杂,而且没有太大价值,不得不说有项目经验的人果真厉害,几句话就点醒了我,现在直接解释。

  1. 协程不是多线程!!! 协程还是在主线程里面,这点十分重要,不要被网上其他资料误导。

  2. 协程不是只能做简单的延迟,虽然你可能用过下面的延迟几秒的代码,但是协程的价值在这里完全体现不出来。

void Start()
{
    StartCoroutine(coRoutine());
}
IEnumerator coRoutine()
{
    yield return new WaitForSeconds(1);
}

因为其实这种只是暂停几秒,完全没必要单独开一个协程,下面这种方法也可以实现

IEnumerator Start () {
        
      // StartCoroutine(coRoutine());

        Debug.Log("1");
       yield return new WaitForSeconds(3);
       Debug.Log("2");
         
	}

是不是很意外,start竟然也可以return,当然一般不这么做,这个例子只是为了说明协程不只是用来做延迟的

  1. 协程的真正用途是分步做一个比较耗时的事情,比如游戏里面的加载资源
private int num = 0;
private const  int total=30;

	void Start()
    {
        StartCoroutine(coRoutine());
    }

   IEnumerator coRoutine()
    {
        while (num<total)
        {
            num++;
            Debug.Log(num);
            yield return null;
        }   
    }
	
	void Update () {
        Debug.Log("update!");
	}
    void LateUpdate()
    {
        Debug.Log("lateUpdate!");
    }
 

上面的代码是个简单的例子,比如我们加载的资源有30个(total),但是一次加载完毕会耗费大量的时间,不可能让玩家在start中等待这么久,这时候协程的作用就出现了,协程是每帧lateUpdate之前执行yield return之前的代码,lateupdate之后执行yield return之后的代码,相当于每帧循环一次(前提是你的协程有循环体,否则一帧就执行完了),具体可以复制我的代码看一下日志,这样就不会卡在这加载30个资源这里,而是你在update里面继续做你的事情,我每次只加载1个,加载1个耗时显然远远小于30个。

上面的例子具体可以对应进入一张地图加载NPC,当你进入一张地图后,如果一次性加载30个NPC,你可能就卡在进地图的地方,等待这30个NPC全部加载出来之后才能行动,但是用了协程,你可以移动,可能你移动一步(或者几步),加载一个NPC,实际上你根本感受不到移动过程中有停顿的现象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值