スローモーション
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()内のコードは、変更せずに動作し続けます。
チャレンジ
中級「プレイ」を押して、彗星がSlowZoneを通過する様子をスローモーションで再生します。
SlowZone.csで、void OnTriggerEnter(Collider other)を記述します。Time.timeScaleをslowScaleに、Time.fixedDeltaTimeを0.02f * slowScaleに設定します。void OnTriggerExit(Collider other)を記述し、それらを1fと0.02fに戻します。
「プレイ」を押してからスペースキーを押すと、彗星はゾーンを速度0.4で滑るように通過します。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class SlowZone : MonoBehaviour
{
public float slowScale = 0.4f;
// 何かがゾーン内にある間はスローモーションにする
}
本格的なゲームを作るのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド