可以理解为按时间间隔执行的函数
协程的返回类型IEnumerator表示可以返回实现IEnumerator接口的任意内容
yield return null;协程会正常执行,表示将函数执行并且返回空的IEnumerator;当返回值为null(或任意数字),表示将在下一个更新继续执行(即下一帧)
使用协程避免在update中使用计时器,与属性结合发挥更大作用。

CoroutinesExample

  1. public class CoroutinesExample : MonoBehaviour
  2. {
  3. public float smoothing = 1f;
  4. public Transform target;
  5. void Start ()
  6. {
  7. StartCoroutine(MyCoroutine(target));
  8. }
  9. IEnumerator MyCoroutine (Transform target)
  10. {
  11. while(Vector3.Distance(transform.position, target.position) > 0.05f)
  12. {
  13. transform.position = Vector3.Lerp(transform.position, target.position, smoothing * Time.deltaTime);
  14. yield return null;
  15. }
  16. print("Reached the target.");
  17. yield return new WaitForSeconds(3f);
  18. print("MyCoroutine is now finished.");
  19. }
  20. }

PropertiesAndCoroutines

  1. public class PropertiesAndCoroutines : MonoBehaviour
  2. {
  3. public float smoothing = 7f;
  4. public Vector3 Target
  5. {
  6. get { return target; }
  7. set
  8. {
  9. target = value;
  10. StopCoroutine("Movement");
  11. StartCoroutine("Movement", target);
  12. }
  13. }
  14. private Vector3 target;
  15. IEnumerator Movement (Vector3 target)
  16. {
  17. while(Vector3.Distance(transform.position, target) > 0.05f)
  18. {
  19. transform.position = Vector3.Lerp(transform.position, target, smoothing * Time.deltaTime);
  20. yield return null;
  21. }
  22. }
  23. }

ClickSetPosition

  1. public class ClickSetPosition : MonoBehaviour
  2. {
  3. public PropertiesAndCoroutines coroutineScript;
  4. void OnMouseDown ()
  5. {
  6. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  7. RaycastHit hit;
  8. Physics.Raycast(ray, out hit);
  9. if(hit.collider.gameObject == gameObject)
  10. {
  11. Vector3 newTarget = hit.point + new Vector3(0, 0.5f, 0);
  12. coroutineScript.Target = newTarget;
  13. }
  14. }
  15. }

停止协程

我们可以使用函数名StartCoroutine(“函数名”)或是方法StartCoroutine(方法())来开启协程,但是直接用StopCoroutine(方法())StopCoroutine(“函数名”)不能关闭协程
关闭的方法

  • StopAllCoroutines();
  • Coroutine coroutine = StartCoroutine(“函数名”); Coroutine coroutine = StartCoroutine(方法());先记录一下

    1. 再**StopCoroutine(coroutine); **