简单记一下协程的使用
例子一
void Update
{
if (Input.GetKeyDown(KeyCode.S))
{
StartCoroutine("Waitforsecond");//开始某个协,括号里可以直接写协程名Waitforsecond(),参数的话
}
}
IEnumerator Waitforsecond()
{
Debug.Log("start");
yield return StartCoroutine(wait(1f));
Debug.Log("one second later");
yield return StartCoroutine(wait(3f));
Debug.Log("three seconds later");
}
这样打印结果依次为start,一秒后打印one second later,三秒后打印three seconds later。
void Update ()
{
if (Input.GetKeyDown(KeyCode.A))
{
StartCoroutine("begin", 5f);
Debug.Log("begin");
}
}
IEnumerator begin(float a)
{
while (true)
{
for (float timer=0; timer<1;timer+=Time.deltaTime)
{
yield return 0;
}
Debug.Log(seconds);
seconds++;
if (seconds > a)
{
StopCoroutine("begin");//停止某个协程, StopAllCoroutines();停止所有协程
Debug.Log("stop");
}
}
}
打印结果为第0秒打印start,第一到六秒分别打印0—5,5打印之后立即打印stop.
程序遇到协程时会挂起,程序继续执行,然后等待下一帧,所以一开始按下A键之后先打印start。
void Update ()
{
if (Input.GetKeyDown(KeyCode.D))
{
StartCoroutine("movetotarget", new Vector3(3f,3f,3f));
}
}
IEnumerator movetotarget(Vector3 a)
{
while(transform.position!=a)
{
transform.position = Vector3.MoveTowards(transform.position, a, 3f*Time.deltaTime);
yield return null;
}
}
例子二
在协程里写while循环就像是Update,每帧都会调用,运行后物体从原位置匀速移动到a位置
private Vector3[] path = new Vector3[]
{
new Vector3( 5f,0f,5f),
new Vector3(0f,5f,5f),
new Vector3(0,0,0),
};
void Update ()
{
if (Input.GetKeyDown(KeyCode.F))
{
StartCoroutine("moveontheway");
}
}
IEnumerator moveontheway()
{
while (true)
{
foreach (Vector3 point in path)
{
yield return StartCoroutine("movetotarget",point);
yield return StartCoroutine(wait(1f));
}
}
}
运行效果类似于守卫巡逻,物体移动到一个位置后等待一秒然后往下一个目标点移动,循环往复。
浙公网安备 33010602011771号