Menu
CoddyTech

スローモーション

CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 35/60。

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行必要です。物理演算の各ステップでは、ゲーム内時間がTime.fixedDeltaTime分(0.02秒)進みます。0.25の場合、この0.02秒に実時間で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()内のコードは、変更せずに動作し続けます。

challenge icon

チャレンジ

中級

「プレイ」を押して、彗星がSlowZoneを通過する様子をスローモーションで再生します。

  1. SlowZone.csで、void OnTriggerEnter(Collider other)を記述します。Time.timeScaleをslowScaleに、Time.fixedDeltaTimeを0.02f * slowScaleに設定します。
  2. void OnTriggerExit(Collider other)を記述し、それらを1fと0.02fに戻します。

「プレイ」を押してからスペースキーを押すと、彗星はゾーンを速度0.4で滑るように通過します。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;

public class SlowZone : MonoBehaviour
{
    public float slowScale = 0.4f;

    // 何かがゾーン内にある間はスローモーションにする
}

本格的なゲームを作るのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド