不知今天大脑CPU转速不够还是怎么了,发现StartCoroutine的运行机制让我懵逼了!!!
简单概述一下:当update里的变量条件和 StartCoroutine();方法里的变量是同一个的话 StartCoroutine();的执行会循环执行和update一样,直到超过StartCoroutine();等待时间才会停止。
具体情况如下:
首先看下面代码,通过i条件来控制StartCoroutine的触发。
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
float i = 1;
int num = 0;
// Use this for initialization
void Start()
{
// StartCoroutine(waitme(1));
}
// Update is called once per frame
void Update()
{
i += 1;
if (i == 13)
{
Debug.Log("i是多少?" + i);
StartCoroutine(waitme(1));
}
//if (num == 0)
//{
// StartCoroutine(waitme(1));
//}
}
IEnumerator waitme(int a)
{
yield return new WaitForSeconds(a);
Debug.Log("两秒已过了"+num);
if (num < 100000)
{
num = num +1;
Debug.Log("num多少?????? " + num);
}
}
}
执行结果如下:
这个看起来非常正常。正是协程。
但是下面的情况就是一个让我懵逼的情况:当我用上述代码里Update里的另个条件来触发StartCoroutine就不同了。等待还是会等待的,但等待时间过去就会循环执行yield后面的代码。
下面是代码:(只是把上个代码里的触发条件换成了下面的)
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
float i = 1;
int num = 0;
// Use this for initialization
void Start()
{
// StartCoroutine(waitme(1));
}
// Update is called once per frame
void Update()
{
//i += 1;
//if (i == 13)
//{
// Debug.Log("i是多少?" + i);
// StartCoroutine(waitme(1));
//}
if (num == 0)
{
StartCoroutine(waitme(1));
}
}
IEnumerator waitme(int a)
{
yield return new WaitForSeconds(a);
Debug.Log("两秒已过了"+num);
if (num < 100000)
{
num = num +1;
Debug.Log("num多少?????? " + num);
}
}
}
再看执行结果;竟然和update一样了,一直执行,直到StartCoroutine的等待时间到了才停止。
上图这个num会执行到49,当我把代码中StartCoroutine等待时间a变成2之后,看下图:
可见它的循环时间是由a来决定的。。。
我只想知道StartCoroutine是什么运行机制???宝宝懵逼了!!!