Unity~協程IEnumerator(詳解)

什麼是協程

協程在當前主程序運行時,開啓另一段邏輯處理,協程主要用於代碼等待

注意事項: ##<協程的方法名最前面最好加上大寫的IE表示這是一個協程>

如果協程中有嵌套協程的時候,關閉當前協程不會影響嵌套的協程,.只會關閉當前協程,嵌套協程繼續執行
1.協程所在腳本關閉的時候協程不會停止,但是協程所在的遊戲對象刪除的時候協程將會被系統回收
2.關於協程的關閉,下面會詳解
3.協程的返回值必須是IEnumerator
4.協程的內部必須體驗Yield return 值
5.協程可以重載
6.協程可以多次調用,但是不可以關閉後繼續運行,只能重新開啓協程
7.協程可以嵌套
8.協程的參數不能使用ref 和out 修飾
9.協程在執行完內部所有代碼的時候會退出協程

關於協程yield return 後面的值

  1. yiled return 0; 0可以換成任意的int類型的值,都是當前暫停一幀,從下一幀開始執行
  2. yiled return 協程,yiled return 後面可以跟一個協程,當執行到該行代碼的時候執行yiled return 後面的協程,如果下面還有代碼在執行完該協程的時候,回來繼續執行.
  3. yiled return 後面可以跟一個WWW類,當下載完成該WWW類的時候,繼續向下面的代碼執行
  4. yiled return new WaitForSeconds(時間),時間可以隨意設置,該方法主要作用是等待幾秒鐘後執行,yiled return 後面的代碼;
  5. yiled return 後面可以跟一個類,等等根據自己的需要進行使用

開啓協程和關閉協程

1.直接使用協程方法名
開啓協程 StartCoroutine(“協程方法名 “);
關閉協程 StopCoroutine(“協程方法名 “);
2.使用協程方法名加參數
開啓協程 StartCoroutine(“協程方法名”,參數);<該方法只適用於協程只有一個參數的時候>
關閉協程 StopCoroutine(“協程方法名”);
3.使用方法
開啓協程 StartCoroutine(協程方法名(參數));<該方法中的參數個數隨意
關閉協程 StopCoroutine(協程方法名(參數));<該方法不能關閉該協程,但是開啓可以使用>

使用方法參數正確開啓關閉協程:
<1>定義一個IEnumerator 類型的全局變量StopIE
public IEnumerator StopIE;
<2>接收 協程方法名(參數)
StopIE = 協程方法名(參數);
<3>開啓協程
在這裏開啓協程可以直接用變量代替方法名加參數
StartCoroutine(StopIE);
<4>關閉協程
在這裏同樣
StopCoroutine(StopIE);

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StrIEScript : MonoBehaviour {
    //定義變量存儲協程
    IEnumerator MoveTarget;
    void Start () {
        MoveTarget = IEMove (transform,2f,20f);
        //通過變量開啓協程
        StartCoroutine (MoveTarget);
    }

    private void Update()
    {
        //按下鼠標左鍵的時候關閉協程
        if (Input.GetMouseButtonDown(0))
        {
            //通過變量關閉協程
            StopCoroutine ( MoveTarget );
        }
    }
    //該協程用於向目標物體的正前方移動,_t秒移動一次,移動速度_speed
    IEnumerator IEMove(Transform _target,float _t,float _speed)
    {

        //協程嵌套,開啓協程
        StartCoroutine ("IERotate",5f);
        //改協程除非手動關閉否則將會永遠存在,因爲存在死循環,協程內部代碼未執行完畢,系統不會回收協程
        while (true)
        {
            yield return new WaitForSeconds (_t);
            _target.Translate (_target.forward*Time.deltaTime*_speed);
        }

    }
    //圍繞自身的Y軸旋轉_t秒
    IEnumerator IERotate(float _t)
    {
        float _timer = 0;
        while (_timer<_t)
        {
            yield return 0;
            transform .Rotate (transform .up,100f*Time.deltaTime);
            _timer += Time.deltaTime;

        }

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章