Edited at

[Unity] 一定の時間間隔で処理を実行する方法まとめ(時間制御)

More than 3 years have passed since last update.

いわゆる、タイマの張り方。


Time.deltaTimeを使う方法

Time.deltaTimeには、最後のフレームからの経過時間[ms]が格納されています。

つまり前回のUpdate()からの経過時間がとれます。

Update()が実行されるたびに経過時間を積み上げていき、指定した時間を超えたら望みの処理を実行するようにします。

// timeOut[ms]毎に処理を実行する

public class ExampleClass : MonoBehaviour {
public float timeOut;
private float timeElapsed;

void Update() {
timeElapsed += Time.deltaTime;

if(timeElapsed >= timeOut) {
// Do anything

timeElapsed = 0.0f;
}
}
}

またdeltaTimeは、 FixedUpdate() 内で取得すると前回のFixedUpdate()実行からの経過時間が取得できます。


Time.timeを使う方法

Time.timeにはアプリケーション起動からの経過時間[ms]が格納されています。

Time.time + タイムアウト時間 をトリガーに処理を実行することでタイマーを実現します。

// timeOut[ms]毎に処理を実行する

public class ExampleClass : MonoBehaviour {
public float timeOut;
private float timeTrigger;

void Update() {
if(time.Time > timeTrigger) {
// Do anything

timeTrigger = Time.time + timeOut;
}
}
}

ただ特に理由がなければdeltaTimeを使えば良いです。

使いどころとして思いつくのは、Update()やFixedUpdate()の更新タイミングとは違う処理時間でタイマ張りたい場合。。(あるのかな?)


StartCoroutine() + WaitForSeconds()を使う方法

StartCoroutine関数を使うことで似非マルチスレッドっぽい動作が可能です。

並列実行させたい関数(例:下のFuncCoroutine関数)を作り、StartCoroutine関数に参照を渡すと並列実行されます。

その呼び出し先に無限ループ&waitを入れることで、一定間隔の繰り返し処理が実現できます。

StartCoroutine()自体は実行後すぐに返ってきますので、呼び出し先の処理が重くなりそうな場合にボトルネック化を防げます。

// timeOut[ms]毎に処理を実行する

public class ExampleClass : MonoBehaviour {
public float timeOut;

void Start() {
StartCoroutine( FuncCoroutine() );
}

IEnumerator FuncCoroutine() {
while(true){
// Do anything

yield return new WaitForSeconds(timeOut);
}
}
}

呼び出し先の関数は返戻値がIEnumarator型でなければいけないのですが、yieldとともに使える待ち時間作成関数WaitForSeconds()がありますので、これを使いましょう。