質問: 0f; // update yield return Utils.Coroutine.WhileForSeconds(T, () => { t1.Translate(direction * v * Time.deltaTime); hist += v * Time.deltaTime; if (Time.time - stime <= tm) v += accel1 * Time.deltaTime; else v += accel2 * Time.deltaTime; }); Debug.Log($"経過時間={Time.time - stime}, 移動距離={hist}, v={v}"); } } ```
回答: コメントで書いてしまいましたが、回答の方に書いておきます。 実現イメージとして、sを求める公式を使い、現時点での期待される移動量(距離)から、前回の地点を差し引いた分を、今回移動させることかと思います。 Unityは触ってないですが、こんな感じでしょうか...? ``` t1.Translate( // 単位ベクトル direction * // sを求める式。経過時間Time.timeの時点での移動量を求める (initSpd * Time.time) + 1 / 2.0 * a * (Time.time * Time.time) - // 前回の位置までは移動済みなのでその分を差し引いて、今回のフレームの相対移動量にする (t1.position - p)); ``` 元のコードの問題点は、たとえばdeltaTimeが30msの場合、「30msの間同じ速度で移動してしまう」ことです。 等加速運動は、その30msの間も「速度を変化させながら移動する」こと(連続的な現象)ですので、そのズレの分、移動しすぎる(突き抜ける)現象が出ているのだと思います。