可以理解为按时间间隔执行的函数
协程的返回类型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); **