本帖最后由 da11 于 2023-3-11 22:09 编辑
协程的案例,一个物体按路径巡逻--重点实操案例
Coroutines_demo.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Coroutines_demo : MonoBehaviour
{
//协程的案例,一个物体按路径巡逻
public Transform[] ports;
private Transform GameObjTF;
private float MoveSpeed = 1;
private void Start()
{
GameObjTF = this.transform;
}
private void OnGUI()
{
if (GUILayout.Button("开始巡逻"))
{
StartCoroutine(Objports(ports));
}
if (GUILayout.Button("停止行动"))
{
//停止本对象中开启的所有协程。
StopAllCoroutines();
}
}
private IEnumerator Objports(Transform[] TFs)
{
foreach (var port in ports)
{
//协程嵌套,等待ObjMoveFF方法执行完后再执行ObjMoveFF方法!!
//通俗点就是移动点不能一下子全部移动过去
//等待找到一个点结束后,再到下一个点,也就是等待MoveToTarget()执行结束后再调用
//先执行了StartCoroutine(ObjMoveFF(port.position)),yield return等待这个方法执行完后,才执行之后的语句!!
yield return (StartCoroutine(ObjMoveFF(port.position)));
//到达目标点后等待两秒
yield return new WaitForSeconds(2);
}
}
private IEnumerator ObjMoveFF(Vector3 port)
{
while (GameObjTF.position != port)
{
//使用Vector3.MoveTowards移动路线,然后通过WaitForFixedUpdate等待控制
gameObject.transform.position = Vector3.MoveTowards(GameObjTF.position, port, Time.deltaTime * MoveSpeed);
//等待当前update帧后执行
//实际作用:移动到某个位置,不是一次移动完成,而是分多次完成,这种场景就适宜用协程实现!
yield return new WaitForFixedUpdate();
}
}
}
|