Help us understand the problem. What is going on with this article?

[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()がありますので、これを使いましょう。

Nagitch
個人でいい感じのサービス・ゲーム開発を目論んでいます。 意識は高くないです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした