可以理解为按时间间隔执行的函数
协程的返回类型IEnumerator表示可以返回实现IEnumerator接口的任意内容
yield return null;协程会正常执行,表示将函数执行并且返回空的IEnumerator;当返回值为null(或任意数字),表示将在下一个更新继续执行(即下一帧)
使用协程避免在update中使用计时器,与属性结合发挥更大作用。
CoroutinesExample
public class CoroutinesExample : MonoBehaviour{public float smoothing = 1f;public Transform target;void Start (){StartCoroutine(MyCoroutine(target));}IEnumerator MyCoroutine (Transform target){while(Vector3.Distance(transform.position, target.position) > 0.05f){transform.position = Vector3.Lerp(transform.position, target.position, smoothing * Time.deltaTime);yield return null;}print("Reached the target.");yield return new WaitForSeconds(3f);print("MyCoroutine is now finished.");}}
PropertiesAndCoroutines
public class PropertiesAndCoroutines : MonoBehaviour{public float smoothing = 7f;public Vector3 Target{get { return target; }set{target = value;StopCoroutine("Movement");StartCoroutine("Movement", target);}}private Vector3 target;IEnumerator Movement (Vector3 target){while(Vector3.Distance(transform.position, target) > 0.05f){transform.position = Vector3.Lerp(transform.position, target, smoothing * Time.deltaTime);yield return null;}}}
ClickSetPosition
public class ClickSetPosition : MonoBehaviour{public PropertiesAndCoroutines coroutineScript;void OnMouseDown (){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;Physics.Raycast(ray, out hit);if(hit.collider.gameObject == gameObject){Vector3 newTarget = hit.point + new Vector3(0, 0.5f, 0);coroutineScript.Target = newTarget;}}}
停止协程
我们可以使用函数名StartCoroutine(“函数名”)或是方法StartCoroutine(方法())来开启协程,但是直接用StopCoroutine(方法())和StopCoroutine(“函数名”)不能关闭协程
关闭的方法
- StopAllCoroutines();
Coroutine coroutine = StartCoroutine(“函数名”); 或 Coroutine coroutine = StartCoroutine(方法());先记录一下
再**StopCoroutine(coroutine); **
