一、WaitForSeconds(任意数字)
-等待对应秒数后执行后面的代码(受timeScale影响)
二、WaitForSecondsRealtime(任意数字)
-等待对应秒数后执行后面的代码(不受timeScale影响)
三、WaitForEndOfFrame()
-等待这一帧所有代码执行完成后执行后面的代码
四、WaitForFixedUpdate()
-等待物理运行完(也就是FixedUpdate()中的代码)之后执行后面的代码
五、yield return null/yield return0
-等待Update()中代码运行完成后执行后面的代码
六、注意事项:协程需要用IEnumerator(迭代器)命名其中必须包含yield return关键字
七、生命周期
Start()>FixedUpdate()>WaitForFixedUpdate()>Update()>yield null>WaitForSeconds()/WaitForSecondsRealtime()>WaitForEndOfFrame()
八、优化
1、需要移动的物体
public class PropertiesAndCoroutines : MonoBehaviour
{
public float smoothing = 7f;
private Vector3 target;
public Vector3 Target
{
get { return target; }
set
{
target = value;
StopCoroutine("Movement");
StartCoroutine("Movement", 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;
}
}
}
2、需要点击的物体
public class ClickSetPosition : MonoBehaviour
{
public PropertiesAndCoroutines coroutineScript;
private void OnMouseDown()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
Physics.Raycast(ray, out hit);
Vector3 newTarget = hit.point;
coroutineScript.Target = newTarget;
}
}