UnityにおけるTime.deltaTimeの単位について

前提

私が一番最初に学習した参考書(リンク)とこれらのサイト1つ目・2つ目のTime.deltaTimeの単位の扱いが異なっているため、どちらが正しいのかわかりません。
*両者ともUpdate関数の中で呼び出すことを前提としております。

前者(猫本)  Time.deltaTime[1/fps = s/f] * fはフレーム sは秒 fpsはf/s

本文の一部を形を変えて抜粋させていただきます。

  例えば、Updateメソッドの中で「プレイヤーの位置をx=1ずつ右に動かす」という処理をしていたとする。その場合「FPS = 60のデバイスでは1秒間に60回Updateメソッドが呼ばれるので、1秒後にはx=60の位置にいることになる」。しかし、「FPS=300のデバイスでは、1秒後にx=300にいることになる」
このような。デバイスの性能による実行計画の違いをなくすために、Updateメソッドの中で移動する距離を「プレイヤの秒速 * Time.deltaTime」とする方法がある。こうすることで、プレイヤの1秒後の位置は「プレイヤの秒速 * Time.deltaTime * FPS」と計算できる。
つまり
プレイヤの1秒後の位置 = プレイヤの秒速 * Time.deltaTime(1/FPS)*FPS

大体このような内容が書かれていました。ここからは私が勝手に考えているだけですが、これらの単位に注目すると、

Time.deltaTime[1/fps = s/f]  ただし、 fはフレーム・sは秒・fpsはf/s

このようになると考えました。
この場合、最終的にプレイヤの秒速[m/s]という単位が出てきます。

後者は  Time.deltaTime[s]

また、1つ目の記事によると、

適当に計算式に混ぜ込めば処理がなめらかになるといった理解は間違いです。答えを言ってしまうと、「右辺にTime.deltaTimeを掛けた時に、左辺と同じ単位になったら使ってもよい」です。

単位には大事な性質があります。1 異なる単位同士は足せない( 距離 + 秒、みたいな計算はできない )2 異なる単位同士は掛け算できる、その場合は別の単位となる(距離 = 速度✕時間、みたいな)3 単位を持たない場合は[1]と表記する(無次元)

さらに、

例2: 速度と速度
続いて、左辺が速度で、この速度を制御したい場合です。この場合、右辺で扱うパラメータが最初から速度であるならばTime.deltaTimeを掛けてはいけません。
これも単位を計算すればすぐわかります。

cs

public class Sample : MonoBehaviour{ private Vector3 _velocity = new Vector3(1, 0, 0); private Rigidbody _rigidbody; void Start() { _rigidbody = GetComponent<Rigidbody>(); } void Update() { // [m/s] = [m/s] * [s] // [m/s] = [m] ←???????? _rigidbody.velocity = _velocity * Time.deltaTime; // 間違い // この場合は普通に代入するだけでよい _rigidbody.velocity = _velocity; }}

このようにありました。
詳しくは1つ目の記事を読んでいただければ幸いです。

*私は元々文系で数学はかなり苦手なため、ナンセンスな質問をしているかもしれません。その場合はご指摘をいただけますと幸いです。

結局のところどっちが正しいのか

私は前者(猫本)が正しいような気がします

後者に

cs

void Update() { // [m/s] = [m/s] * [s] // [m/s] = [m] ←???????? _rigidbody.velocity = _velocity * Time.deltaTime; // 間違い // この場合は普通に代入するだけでよい _rigidbody.velocity = _velocity; }

このようにありましたが、私は

cs

void Update() { _rigidbody.velocity = _velocity * Time.deltaTime * FPS(FPSはUpdate内で強制的にかかる); // 本来ならばUpdateの中にはFPSがかかっていることを考慮するべきなので上の例は// [m/s] = [m/s] * [s/f(1/FPS)]*[f/s(FPS)] だからOK // よってTime.deltaTimeをかけてもOK _rigidbody.velocity = _velocity * Time.deltaTime; }

このように考えました。

また、
1 そもそも、単位は両辺合わせないとダメなのか
2 Unityのベクトルには単位はつくのか(リンク)

この質問に対しても何かしらアドバイスがあれば教えていただきたいです。誤字脱字があった場合には追記いたします。よろしくお願いいたします。

*私の稚拙な質問で気分を害された場合は申し訳ございません。

コメントを投稿

0 コメント