unity3D中协程IEnumerator使用

版权声明:未经本人同意不得转载 https://blog.csdn.net/jjjndk1314/article/details/84980770

练习 :物体本身是白色,当点击攻击按钮后,物体变红,1秒后变回原来的颜色

public class ChangeColor : MonoBehaviour
{
    private Color oldColor;
    private MeshRenderer render;
    private void Start(){
        render = this.GetComponent<MeshRenderer>();
        oldColor = render.material.color;
    }
    private void Damage(){
        StartCoroutine("ChangeColorFunc");     //调用
      // StartCoroutine(ChangeColorFunc());  //函数参数调用
      // StopCoroutines();只能停止一字符串启动的协程
    }
    private IEnumerator ChangeColorFunc() {     //定义协程
        render.material.color = Color.red;
        yield return new WaitForSeconds(1);
        render.material.color = oldColor;
    }
    private void OnGUI()
    {
        if (GUILayout.Button("攻击"))
            Damage();
    }
}

多个路点巡逻:每到一点等待一段时间再继续巡逻

/// <summary>
/// 路点巡逻
/// </summary>
public class PathTest : MonoBehaviour{
    public Transform[] points;//路点
    public float speed = 5;
    private bool loop = true;
    private void OnGUI() {//找到一个路点等待2秒,并且可以循环巡逻
        if (GUILayout.Button("开始"))
            StartCoroutine(MoveToPath());
        else if (GUILayout.Button("停止"))
            StopAllCoroutines();//停止本对象中所有协程
    }
    private IEnumerator MoveToPath(){
        do
        {
            foreach (var point in points)
            {
                //协程嵌套
                //找到目标点后再找下一个点,等待MoveToTarget()方法执行结束后再启用协程
                yield return StartCoroutine(MoveToTarget(point.position));
                yield return new WaitForSeconds(2);
            }
        } while (loop);

    }
    //找目标点,不是一次,而是分多次,所以此处适宜用协程
    private IEnumerator MoveToTarget(Vector3 target){
        while (transform.position != target){
            transform.position = Vector3.MoveTowards(transform.position, target,
                speed * Time.deltaTime);
            yield return new WaitForFixedUpdate();
        }
        //yield return new WaitForSeconds(2);
    }
 
}

猜你喜欢

转载自blog.csdn.net/jjjndk1314/article/details/84980770