スポンサーリンク

Unityで一定時間間隔で生成・移動したりする方法はFixedUpdateがおすすめ

一定間隔のオブジェクト生成と移動にはFixedUpdate関数がおすすめ Unity

結論

結論から言うと、一定間隔でオブジェクトを生成したり移動させたい場合は、Update関数ではなくFixedUpdate関数を使いましょう。

以上がこの記事の要約になります。

詳しい実装の仕方や呼び出し感覚の細かい調整をしたい方は引き続き読んでいただけると良いかと思います。

説明の際の事前準備

Sphereを用いた自由落下実験の準備

まずは、実験体として、PlaneとSphereを用意します。

Sphereには事前に、Rigidbodyをアタッチさせてあります。Positionは(0,10,0)です。

Sphereには「fix」というスクリプトをアタッチして、こちらを編集して一定間隔の呼び出しを説明していきます。

Update関数の場合

Update関数のスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class fix : MonoBehaviour
{
    Rigidbody rb;
    // Start is called before the first frame update
    void Start()
    {
        rb = this.transform.GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        if(0 < rb.velocity.magnitude)
        {
            Debug.Log(rb.velocity.magnitude);
        }
        
    }
}

スクリプトの中身を簡単に説明しますと、フレームごとにSphereの速度がコンソール画面にログとして残されていきます。

※上のスクリプトをコピーして使っていただいて大丈夫ですよい〇

下の画像がUpdate関数の場合の結果になります。

Update関数の実行結果

コンソール画面を見てください。

三つ目から、「3.531599」と不自然な飛び方をしているのがうかがえます。

これでは一定間隔の呼び出しとはいいがたいものです…

Update関数は「1フレームごと」に更新されていきます。

そのため、時間間隔の精度をそこまで高くなくていいよという方は気になさらないでよろしいかと思いますが、物理現象の検証をする際は改善しなければなりません。

改善するために一番簡単なのがFixedUpdate関数を用いることです。

以下、説明していきます!

FixedUpdate関数の場合

FixedUpdate関数のスクリプト

こちらのスクリプトはUpdate関数をFixedUpdate関数に変えただけです。

以下の画像が、FixedUpdate関数の処理結果になります。

FixedUpdate関数の実行結果

重力加速度が0.98なのできれいに速度が出ていることがうかがえます。

Update関数のときにあった不自然な速度の飛びもFixedUpdate関数を用いることで改善されているのがわかります。

そして、このFixedUpdate関数の呼び出しは自身で変えることが可能です。

「Edit」→「ProjectSettings」の出し方

「Edit」→「ProjectSettings」でProjectSettingのタブを開きます。

すると「Time」の「FixedTimestep」で何秒ごとにFixedUpdate関数が処理されていくのか確認することができます。

自分の処理したい感覚に合わせてデフォルトで設定されている「0.02」の数値を変えると対応幅が増えると思います。

詳しく知りたい方

Unityには関数の処理順番などが設計されており、詳細が気になる方は以下の公式リンクを参考にするとよいです。

イベント関数の実行順序 - Unity マニュアル
Unity スクリプトを実行すると、既定の順序で多くのイベント関数が実行されます。このページでは、これらのイベント関数について説明し、それらがどのように実行シーケンスに収まるかを説明します。

何か質問やご要望がございましたらお問い合わせまで

コメント

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