zoukankan      html  css  js  c++  java
  • 协程

    简单记一下协程的使用

    例子一

    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));
                }
                
            }
        }
    

      运行效果类似于守卫巡逻,物体移动到一个位置后等待一秒然后往下一个目标点移动,循环往复。

  • 相关阅读:
    HDU 5495:LCS
    关于使用了cudaMallocHost之后发生 segment fault的原因
    关于grub 损坏的问题
    LightOJ
    LightOJ
    poj3268--Silver Cow Party (最短路+技巧)
    hdoj1443--Joseph (约瑟夫环)
    poj2549--Sumsets (sum)
    UVA11080
    hdoj1548--A strange lift(bfs.)
  • 原文地址:https://www.cnblogs.com/lanrenqilanming/p/6937857.html
Copyright © 2011-2022 走看看