测试一:
public class TestCoroutine1 : MonoBehaviour
{private bool isTimeCountDownAlive = false;
private IEnumerator CroTimeCountDown;
void Start ()
{
CroTimeCountDown = TimeCountDown();
}
void Update ()
{
if (Input.GetKeyDown(KeyCode.S))
{
StartTimeDownCoroutine();
}
if (Input.GetKeyDown(KeyCode.H))
{
StopTimeDownCoroutine();
}
}
private int countDown = 5;
IEnumerator TimeCountDown()
{
for (int i = countDown; i >= 0; i--)
{
yield return new WaitForSeconds(1);
if (!isTimeCountDownAlive)
{
yield break;
}
Debug.LogError("Time ===" + i);
if (i == 0)
{
Debug.LogError(i + "CountDownEnd = " + isTimeCountDownAlive);
}
}
}
void StartTimeDownCoroutine()
{
isTimeCountDownAlive = true;
// StartCoroutine(CroTimeCountDown);//此种方式为继续执行上一次协同程序未执行的部分
StartCoroutine(TimeCountDown());//每次都是重新执行该协同程序
}
void StopTimeDownCoroutine()
{
isTimeCountDownAlive = false;
//StopCoroutine(CroTimeCountDown);//对应此种关闭协同方式,与此种方式开启协同一样
StopCoroutine(TimeCountDown());//对应此种关闭协同方式,与此种方式开启协同一样
}
}
2.测试二:
public class TestCoroutine2 : MonoBehaviour
{
private IEnumerator coroutine;
void Start ()
{
coroutine = Test(new float[]{1.2f, 4}, "dd", 2);
StartCoroutine(coroutine);
//StartCoroutine(Test(1, "dd"));
//StartCoroutine("Test", 2);
}
void Update ()
{
if(Input.GetKeyDown(KeyCode.A))
{
StopCoroutine(coroutine);
// StopCoroutine("Test");// 可以阻止StartCoroutine(“Test”);执行,,但性能开销大,且只能传递一个参数
//StopCoroutine(Test());不能够阻止协同继续执行,
Debug.Log("hello");
//StopAllCoroutines();//可以阻止各种协同继续执行
}
}
IEnumerator Test(float[] a, string str, int ? w = 0)
{
//while(Time.time < 8f)
{
yield return new WaitForSeconds(1f);
Debug.Log(a[1] + Time.time + str);
}
yield return new WaitForSeconds(1f);
Debug.Log(Time.time);
yield return new WaitForSeconds(1f);
Debug.Log(Time.time + str);
yield return new WaitForSeconds(1f);
Debug.Log(Time.time + "==" + w);
yield return new WaitForSeconds(1f);
Debug.Log(Time.time);
yield return new WaitForSeconds(1f);
Debug.Log(Time.time + str);
yield return new WaitForSeconds(1f);
Debug.Log(Time.time);
}
}