协程的概念
协程就是“协同程序”,并不是多线程
既然叫协同,所以还有一个主程序,那么这个主程序其实就是我们的目前学习到的各种生命周期函数
为什么需要协程?
主程序已经在执行某个任务,希望“同时运行”其他逻辑,这里的同时,并不是多线程意义上的同时,只是感官上是同时
协程函数的定义
public IEnumerator Demo() //协程函数的定义
{
print("做某些事");
yield return new WaitForSeconds(1.0f); //等待一秒
print("做一些事");
yield return null; //还有很多返回值。
}
public int Main() //普通函数的定义
{
return 0;
}
协程函数和普通函数不一样,不会因为前面的返回,不执行后面的代码
协程函数的使用
StartCoroutine();
//执行一个协程,参数直接调用协程方法即可,可以用一个变量接受返回值用于后续停止该协程。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class L2_10Demo : MonoBehaviour
{
void Start()
{
StartCoroutine("Demo");
StartCoroutine(Demo()); //这个可以传入参数
}
void Update()
{
}
public IEnumerator Demo() //协程函数的定义
{
print("做某些事");
yield return new WaitForSeconds(1.0f); //等待一秒
print("做一些事");
yield return null; //还有很多返回值。
}
}
可以使用协程函数做动画,这里以一个旋转的动画为例:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class L2_10Demo : MonoBehaviour
{
void Start()
{
// StartCoroutine("Demo");
// StartCoroutine(Demo()); //这个可以传入参数
// StartCoroutine("Zhuan");
StartCoroutine(Demo3());
}
void Update()
{
}
private IEnumerator Zhuan()
{
while(true)
{
yield return new WaitForSeconds(0.1f);
transform.Rotate(new Vector3(10, 0, 0));
}
}
public IEnumerator Demo3()
{
transform.position = new Vector3(2, 2, 2); //先瞬移到(2,2,2);再执行下面的语句
yield return Zhuan(); //这里返回Zhuan,就是调用这个函数。
}
}
协程函数的停止
协程如果运行到最后一行,意味着停止,但是如果我们想主动停止,就输入以下命令:
StopAllCoroutines():结束全部协程
StopCoroutine(); 结束某个协程序
StopCoroutine ( lEnumerator routine); 和调用协程一样使用,但是如果协程有参数不要使用这个。
StopCoroutine(Coroutine routine); 参数填写协程变量
StopCoroutine(string methodName); 参数填写协程方法的名