スポンサーリンク

【Unity】一定間隔で処理を実行する方法

c#

Update内でカウントする方法

using UnityEngine;

public class Repeat : MonoBehaviour
{
    private float _repeatSpan;    //繰り返す間隔
    private float _timeElapsed;   //経過時間


    private void Start()
    {
        _repeatSpan = 5;    //実行間隔を5に設定
        _timeElapsed = 0;   //経過時間をリセット
    }

    private void Update()
    {
        _timeElapsed += Time.deltaTime;     //時間をカウントする

        //経過時間が繰り返す間隔を経過したら
        if (_timeElapsed >= _repeatSpan)
        {
            //ここで処理を実行

            _timeElapsed = 0;   //経過時間をリセットする
        }
    }
}

この方法では、Update関数が実行されるたびに、Time.deltaTimeを使って、直前のフレームと現在のフレームで経過した時間をカウントしていき、目標の時間に到達したら、処理を実行してカウントをリセットすることで、一定間隔で処理を実行しています。

これが一番シンプルな実装方法です。

Time.deltaTime

直前のフレームと現在のフレームの経過時間を取得することができます。
ゲームが60FPSで実行されている場合は、約1/60秒(0.016...)となります。

非同期処理で繰り返す方法

using System.Collections;
using UnityEngine;

public class Repeat : MonoBehaviour
{
    private float _repeatSpan;      //繰り返す間隔


    private void Start()
    {
        _repeatSpan = 5;                    //実行間隔を5に設定
        StartCoroutine(RepeatFunction());   //繰り返し処理を呼び出す
    }

    //繰り返し処理
    private IEnumerator RepeatFunction()
    {
        //無限ループ
        while (true)
        {
            yield return new WaitForSeconds(_repeatSpan); //5秒待つ
            //ここで処理をする
        }
    }
}

この方法では、コルーチンを呼び出して、Update関数とは別に繰り返し処理を行っています。
RepeatFunction関数内で、無限ループを作り、無限ループ内で待ち時間だけ待機したら、処理を実行して、また無限ループに戻ることで、繰り返し処理を実行しています。

用途としては、シンプルに繰り返し実行したい時などに使うことができます。

コルーチン IEnumerator

コルーチンは、処理を中断して任意のタイミングで中断したところから、処理を再開することができる機能です。

詳しくは長くなるので、改めてコルーチンをメインで紹介したいと思います。

非同期処理でカウントをする方法

using System.Collections;
using UnityEngine;

public class Repeat : MonoBehaviour
{
    private float _repeatSpan;      //繰り返す間隔
    private float _timeElapsed;     //経過時間


    private void Start()
    {
        _repeatSpan = 5;                    //実行間隔を5に設定
        StartCoroutine(RepeatFunction());   //繰り返し処理を呼び出す
    }

    //繰り返し処理
    private IEnumerator RepeatFunction()
    {
        //無限ループ
        while (true)
        {
            _timeElapsed += Time.deltaTime;     //時間をカウントする

            //経過時間が繰り返す間隔を経過したら
            if (_timeElapsed >= _repeatSpan)
            {
                //ここで処理をする
                _timeElapsed = 0;
            }
            yield return null;  //次のフレームへ
        }
    }
}

この方法では、先ほどと同様にコルーチンを呼び出して、Update関数とは別に繰り返し処理を行っています。RepeatFunction関数内で、無限ループを作り無限ループ内で、経過時間のカウントを行い、目標の時間を経過したら処理を実行してカウントをリセットすることで、一定間隔で処理を実行しています。

用途としては、timeElapsedをカウントしているので、経過時間を表示したりすることができます。

繰り返し処理の紹介は以上です。

お疲れさまでした!

タイトルとURLをコピーしました