不少小伙伴会分不清线程和协程的区别,这也是不少初级程序面试常常遇到的题目,在此特出一个系列,专门讲解Unity协程。
使用协程的做用一共有两点:
1. 延时(等待)一段时间执行代码;
2. 等某个操做完成以后再执行后面的代码。总结起来就是一句话:控制代码在特定的时机执行。
不少初学者,都会下意识地以为协程是异步执行的,都会以为协程是C# 线程的替代品,是Unity不使用线程的解决方案。
因此首先,请你牢记:协程不是线程,也不是异步执行的。协程和 MonoBehaviour 的 Update函数同样也是在MainThread中执行的。使用协程你不用考虑同步和锁的问题。
下面请看协程的开启方法:
public Coroutine StartCoroutine(IEnumerator routine);1.根据协程定义的方法体来开启2.根据方法体对应的协程引用来开启。
public Coroutine StartCoroutine(string methodName, object value = null);根据协程定义的方法名字符串开启协程。
中止协程的方法:
public void StopCoroutine(string methodName);根据协程的方法名,来中止协程。
public void StopCoroutine(IEnumerator routine);根据保存的协程引用,来中止协程。
public void StopAllCoroutines();中止在本Behavior上运行的全部协程。(注意:本Behavior)web
参考一下代码的例子: copy面试
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
// 保持一个执行脚本的引用
private IEnumerator coroutine;
void Start () {
print("Starting " + Time.time);
//方法1:保存协程的引用,开启协程;
{
coroutine = WaitAndPrint(3.0f);
StartCoroutine(coroutine);
}
//方法2:把协程的方法做为字符串,开启协程
{
StartCoroutine("WaitAndPrint",3.0f);
}
print("Done " + Time.time);
}
// 每隔3秒,打印一次
// 由yield来挂起(暂停)函数
public IEnumerator WaitAndPrint(float waitTime) {
while (true) {
yield return new WaitForSeconds(waitTime);
print("WaitAndPrint " + Time.time);
}
}
void Update () {
if (Input.GetKeyDown("space")){
//方法2:利用保存的协程变量 中止
{
StopCoroutine(coroutine);
}
//方法2:字符串 中止协程
{
StopCoroutine("WaitAndPrint");
}
//方法2:中止本脚本下运行的全部协程
{
StopAllCoroutines();
}
print("Stopped " + Time.time);
}
}
}