スローモーション
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 34/56。
0から1までのTime.timeScaleはスローモーションです。0.25の場合、Time.deltaTimeは実際のフレーム時間の4分の1になるため、speed * Time.deltaTimeで動かす車は実時間1秒ごとに通常の4分の1の距離を進み、Rigidbodyは通常の4分の1の速度で飛んだり落下したりし、WaitForSeconds(1f)は実時間で4秒間続きます。1を超えるとゲームは高速で進みます。2なら速度は2倍です。
物理演算にはもう1行必要です。各物理演算ステップでは、ゲーム内時間の0.02秒であるTime.fixedDeltaTimeだけゲームが進み、0.25の場合、それには実時間で0.08秒かかります。つまり、FixedUpdate()は実時間1秒あたり12.5回しか実行されないため、剛体は5フレームに1回しか動かず、カクつきます。ステップ幅を同じ割合で小さくし、その後、両方の値を元に戻してください。UnityはfixedDeltaTimeを自動でリセットしないためです。このスクリプトは、Spaceキーを押している間、ゲームの速度を遅くします。
float normalStep;
void Awake()
{
normalStep = Time.fixedDeltaTime; // 新規プロジェクトでは0.02
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Time.timeScale = 0.25f;
Time.fixedDeltaTime = normalStep * Time.timeScale;
}
if (Input.GetKeyUp(KeyCode.Space))
{
Time.timeScale = 1f;
Time.fixedDeltaTime = normalStep;
}
}ステップ幅を小さくすれば、物理演算は実時間1秒あたり50回のままで、各ステップで進むゲーム内時間は4分の1になるため、スローモーションは滑らかに保たれます。ステップ幅はゲーム内の秒数なので、Time.deltaTimeを使うFixedUpdate()内のコードは、変更せずに動作します。
チャレンジ
中級彗星が空を横切り、Space が左から発射します(Launcher.cs は準備済み)。飛行中、彗星はトリガーボックスの SlowZone を通過します。その飛行区間はスローモーションで再生されるようにしましょう。SlowZone.cs を作成します。
- 何かがゾーンに入ると、ゲーム時間は
slowScale(Inspector で 0.4)で進み、物理演算のステップも 0.02 から同じ倍率で小さくなるため、彗星は滑らかに動き続けます。 - ゾーンを出ると、時間は再び通常の速度で進み、物理演算のステップも 0.02 に戻ります。
Play を押し、Space を押して彗星が通過するのを見てから、Check を押します。
自分で試してみよう
using UnityEngine;
public class SlowZone : MonoBehaviour
{
public float slowScale = 0.4f;
// 何かがゾーン内にある間はスローモーションにする
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。