結論
結論から言うと、一定間隔でオブジェクトを生成したり移動させたい場合は、Update関数ではなくFixedUpdate関数を使いましょう。
以上がこの記事の要約になります。
詳しい実装の仕方や呼び出し感覚の細かい調整をしたい方は引き続き読んでいただけると良いかと思います。
説明の際の事前準備
まずは、実験体として、PlaneとSphereを用意します。
Sphereには事前に、Rigidbodyをアタッチさせてあります。Positionは(0,10,0)です。
Sphereには「fix」というスクリプトをアタッチして、こちらを編集して一定間隔の呼び出しを説明していきます。
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関数の場合の結果になります。
コンソール画面を見てください。
三つ目から、「3.531599」と不自然な飛び方をしているのがうかがえます。
これでは一定間隔の呼び出しとはいいがたいものです…
Update関数は「1フレームごと」に更新されていきます。
そのため、時間間隔の精度をそこまで高くなくていいよという方は気になさらないでよろしいかと思いますが、物理現象の検証をする際は改善しなければなりません。
改善するために一番簡単なのがFixedUpdate関数を用いることです。
以下、説明していきます!
FixedUpdate関数の場合
こちらのスクリプトはUpdate関数をFixedUpdate関数に変えただけです。
以下の画像が、FixedUpdate関数の処理結果になります。
重力加速度が0.98なのできれいに速度が出ていることがうかがえます。
Update関数のときにあった不自然な速度の飛びもFixedUpdate関数を用いることで改善されているのがわかります。
そして、このFixedUpdate関数の呼び出しは自身で変えることが可能です。
「Edit」→「ProjectSettings」でProjectSettingのタブを開きます。
すると「Time」の「FixedTimestep」で何秒ごとにFixedUpdate関数が処理されていくのか確認することができます。
自分の処理したい感覚に合わせてデフォルトで設定されている「0.02」の数値を変えると対応幅が増えると思います。
詳しく知りたい方
Unityには関数の処理順番などが設計されており、詳細が気になる方は以下の公式リンクを参考にするとよいです。
何か質問やご要望がございましたらお問い合わせまで
コメント