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
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
留言
張貼留言