InvokeRepeatingを利用して繰り返し同じ処理をする【Unityメモ】

今回はUnityのスクリプトで繰り返し処理を行う「InvokeRepeating」のメモです。

はじめに

Unityのバージョンは2021.3.14f1です。

同じ処理を定期的に繰り返し実行する方法はいくつかありますが、今回は「InvokeRepeating」を利用してみます。

実装開始

まずは「2D Object」→「Sprites」→「Square」を追加。

Squareに「Rigidbody2D」をアタッチし、BodyTypeをKinematicに変更。

下記のスクリプトを作成します。

using UnityEngine;

public class movePos : MonoBehaviour
{
    private Rigidbody2D _rb;
    private float Xpos = 0f;

    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();       
        movePosition();
    }

    private void movePosition()
    {
        if (Xpos <= 8.0f)
        {
            Xpos += 0.02f;
            _rb.MovePosition(new Vector2(Xpos,0));
            Invoke("movePosition", 0.01f);
        }
    }
}

Squareオブジェクトにアタッチして実行すると、下記の様になります。指定の位置までmovePositionで何度も実行して動かしています(再帰処理)。

同じ処理をInvokeRepeatingを使うと下記の様な感じに。

using UnityEngine;

public class movePos : MonoBehaviour
{
    private Rigidbody2D _rb;
    private float Xpos = 0f;

    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
        InvokeRepeating("movePosition", 0f, 0.01f);
    }
    private void movePosition()
    {
        if (Xpos <= 8.0f)
        {
            Xpos += 0.02f;
            _rb.MovePosition(new Vector2(Xpos,0));
        }
    }
}

公式リファレンスは下記。0.01秒ごとにmovePositionを実行します。

一定周期で生成

Squareをプレハブ化して、ヒエラルキーメニューから消します。

CreateEmptyで空オブジェクトを追加し、CreateSquareとします。

下記スクリプトを作成します。一定周期で生成します。

using UnityEngine;

public class CreateSquare : MonoBehaviour
{
    [SerializeField] private GameObject _SquarePrefab;
    [SerializeField] private float _interval;

    void Start()
    {
        InvokeRepeating("SquareIns", 0f, _interval);
    }
    private void SquareIns()
    {
        Instantiate(_SquarePrefab);
    }
}

アタッチして、下記の様にパラメータをセット

実行すると下記の様な感じに動きます。

Update関数で時間を計りながら生成するよりすっきりする感じ、定期的に出てくる敵とかに使えそう。止める時はCancelInvoke。

CancelInvoke("SquareIns");
タイトルとURLをコピーしました