Unity中常見的3類等待方法(StartCoroutine, Invoke,Time,deltaTime )

第一種:StartCoroutine

 public class StartCoroutineTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("StartCoroutineTest Start" + Time.time);

        StartCoroutine(CoroutineTest());
    }

    IEnumerator CoroutineTest()
    {
        Debug.Log("CoroutineTest Start At" + Time.time);
        yield return new WaitForSeconds(1f);
        Debug.Log("CoroutineTest End At" + Time.time);
    }
}

最早學到的一種協程。
用StartCoroutine()
執行 IEnumerator CoroutineTest()函式,

函式利用 yield return new WaitdforSec來等待時間,之後再執行後續程式進而達成等待效果。



第二種 Invoke跟 InvokeRepeating


 public class InvokeScript : MonoBehaviour
{
    public GameObject target;


    void Start()
    {
        Invoke("SpawnObject", 2);
    }

    void SpawnObject()
    {
        Instantiate(target, new Vector3(0, 2, 0), Quaternion.identity);
    }
}



Invoke("SpawnObject", 2)
指的是 2秒後執行下方的 SpawnObject()功能

假使是 InvokeRepeating就會寫成
InvokeRepeating("SpawnObject", 2, 1);
指的是 2秒後執行SpawnObject()功能,並且每1秒重複一次

Invoke算是用起來最方便的了,不過由於他只能指定沒有帶參數的功能,所以有時候還是得兼用其他計時方法。

使用上還可以兼用
IsInvoking 判斷成是是否被延時;
CancelInvoke 取消當前腳本上的Invoke方法。
來進行更多變化。


第三種 Time.time  跟 Time.deltaTime
Time.time會紀錄總經過的時間,所以可以搭配一些方法來延後下一個功能觸發的時間

如射擊遊戲常見的射擊間隔
        if (Input.GetButton("Fire1") && Time.time > nextFire)
        {
            nextFire = Time.time + FireRate;
            if (!IsLevelClear) //通關了的話就停止射擊
            {
                shot();
            }
        }
值行後就將nextFire改為當前Time.time + FireRate的時間 藉此判斷下一個發射時間。


Time.deltaTime則是用於提供這個Frame到下個Frame間的時間。
所以當FPS不論是60還是30,在同FPS下他的值都會一致
所以也可以考慮拿他來處理跟遊戲公平性有關的計時,比較常見的就是用於位移上面。
當然要更公平的話也可以考慮用fixedDeltaTime。

大致上這邊比較常用的就這幾種,不妨參考看看,有錯的地方也歡迎指出喔 :D




留言

熱門文章