1. はじめに
ゲームを作るとき、キャラクターの移動やアニメーション、エフェクトのタイミングなど、時間の管理はとても重要です。でも、ゲームの処理はフレームごとに実行されるので、プレイヤーのPCの性能やフレームレートによって動きがバラバラになってしまうことがあります。例えば、60FPS(1秒間に60フレーム)で動くゲームと、30FPS(1秒間に30フレーム)で動くゲームでは、キャラクターの移動速度に違いが出てしまうんです。
そこで登場するのが、UnityのTimeクラス!
Timeクラスを使うと、フレームレートに関係なく一貫した動作を実現したり、ゲームの時間をコントロールすることができます。例えば、以下のようなことが可能になります。
- フレームレートに依存しないスムーズな動き
- スローモーションや早送りの実装
- 一時停止(ポーズ)機能の作成
- カウントダウンタイマーの実装
この記事では、Timeクラスの基本的な使い方から応用テクニックまで、初心者にもわかりやすく解説していきます!時間管理をマスターして、より快適でスムーズなゲームを作りましょう!
2. Timeクラスの基本機能
Unityの**Time
クラス**は、ゲームの時間を管理するために用意された便利な機能が詰まったクラスです。時間に関する情報を取得したり、ゲームの速度を調整したりすることができます。ここでは、ゲーム開発でよく使うTime
クラスの主要なプロパティを解説します!
2.1 Time.time:ゲーム開始からの経過時間を取得
**Time.time
**は、**ゲームが開始されてからの経過時間(秒単位)**を取得できます。
📝 Time.time
の使い方
void Update()
{
Debug.Log("ゲーム開始からの経過時間: " + Time.time + "秒");
}
このスクリプトを実行すると、コンソールにゲーム開始からの経過時間が毎フレーム表示されます。
💡 活用例
- カウントアップタイマーの作成
- 一定時間後にイベントを発生させる
- プレイヤーのプレイ時間を計測する
2.2 Time.deltaTime:フレームごとの経過時間
**Time.deltaTime
**は、**前フレームからの経過時間(秒単位)**を取得できます。
これは、フレームレート(FPS)に依存せずにオブジェクトを動かすために必須のプロパティです。
📝 Time.deltaTime
の使い方
void Update()
{
transform.Translate(Vector3.forward * 5f * Time.deltaTime);
}
このスクリプトは、オブジェクトを毎フレーム前方向に5m/秒のスピードで移動させます。
もしTime.deltaTime
を使わずに5f
だけで移動させると、PCの性能によって移動スピードが変わってしまうため、ゲームの動作が不安定になります。
💡 活用例
- フレームレートに依存しないオブジェクト移動
- アニメーションやエフェクトの再生速度調整
- 時間ベースのスコア加算
2.3 Time.fixedDeltaTime:物理演算の更新間隔
**Time.fixedDeltaTime
**は、**FixedUpdate()が呼ばれる間隔(デフォルトは0.02秒)**を表します。
Unityの物理演算(Rigidbodyなど)は、通常のUpdate()
とは別に**FixedUpdate()
で一定の間隔ごとに更新**されます。この間隔がTime.fixedDeltaTime
です。
📝 Time.fixedDeltaTime
の使い方
void FixedUpdate()
{
transform.Translate(Vector3.forward * 5f * Time.fixedDeltaTime);
}
FixedUpdate()
は一定間隔で実行されるため、物理演算を行う場合はこちらでTime.fixedDeltaTime
を使うのがベストです。
💡 活用例
- Rigidbodyを使った物理演算
- 一定間隔での処理(エネルギー回復、弾の発射など)
- 正確な時間制御が必要な処理
2.4 Time.timeScale:ゲームの時間の進行速度を変更
**Time.timeScale
**を変更することで、ゲーム全体の時間の流れを遅くしたり速くしたりできます。
📝 Time.timeScale
の使い方
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Time.timeScale = 0.5f; // ゲームスピードを半分にする
}
}
このスクリプトを実行すると、スペースキーを押すとゲームがスローモーションになります。
💡 活用例
- スローモーション演出
- ゲームの一時停止(Time.timeScale = 0)
- 高速モード(タイムアタックなど)
まとめ
プロパティ | 説明 | 主な用途 |
---|---|---|
Time.time | ゲーム開始からの経過時間 | プレイ時間計測、タイマー |
Time.deltaTime | フレームごとの経過時間 | フレームレートに依存しない動き |
Time.fixedDeltaTime | 物理演算の更新間隔 | Rigidbodyの移動、定期処理 |
Time.timeScale | 時間の進行速度を変更 | スローモーションや一時停止 |

Time
クラスを使いこなせば、ゲームの挙動をフレームレートに依存せず正確に管理できます!
次のセクションでは、これらを活用した「フレームレートに依存しない動作の実装」について解説します。
3. フレームレートに依存しない動作を実装する
ゲーム開発では、キャラクターの移動やアニメーションなどの処理をフレームごとに更新します。しかし、プレイヤーのPCやデバイスによってフレームレート(FPS)が異なるため、フレームごとに一定の値を加算するだけでは動きにばらつきが出てしまいます。
例えば、60FPSの環境では1秒間に60回処理が走りますが、30FPSだと30回しか処理が実行されません。このままでは、フレームレートが低いほど動きが遅くなり、ゲーム体験に大きな影響を与えてしまいます。これを防ぐために、Time.deltaTime
や FixedUpdate()
を活用して、フレームレートに依存しない動作を実装する方法を解説します。
① Time.deltaTime を使ったキャラクター移動
Unityでは、Update()
メソッド内でオブジェクトを移動させる際に Time.deltaTime
を掛けることで、フレームレートの影響を受けずに一定速度で移動させることができます。
コード例:プレイヤーの移動
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed = 5f; // 移動速度
void Update()
{
// 入力を取得
float moveX = Input.GetAxis("Horizontal");
float moveZ = Input.GetAxis("Vertical");
// 移動量を計算(フレームレートに依存しない移動)
Vector3 move = new Vector3(moveX, 0, moveZ) * speed * Time.deltaTime;
// オブジェクトを移動
transform.Translate(move);
}
}
解説
Time.deltaTime
を掛けることで、フレームごとの処理回数に関わらず、常に一定のスピードで移動できる。Input.GetAxis("Horizontal")
でプレイヤーの左右移動、Input.GetAxis("Vertical")
で前後移動を取得。transform.Translate(move)
でオブジェクトを動かす。
このコードを使えば、どんなフレームレートでも一貫したスムーズな動きを実現できます。
② FixedUpdate() を使った物理演算の制御
Update()
はフレームごとに呼び出されるため、フレームレートが変動すると処理の回数が不規則になり、物理演算に影響を与える可能性があります。そこで、Unityでは物理演算を一定の時間間隔で更新する FixedUpdate()
というメソッドが用意されています。
コード例:Rigidbodyを使った移動
using UnityEngine;
public class PlayerPhysicsMovement : MonoBehaviour
{
public float speed = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float moveX = Input.GetAxis("Horizontal");
float moveZ = Input.GetAxis("Vertical");
Vector3 move = new Vector3(moveX, 0, moveZ) * speed;
// 物理演算を使って移動
rb.velocity = move;
}
}
解説
FixedUpdate()
はTime.fixedDeltaTime
ごとに実行され、一定の時間間隔で更新されるため、物理演算の安定性が向上する。Rigidbody.velocity
を使ってオブジェクトの移動を制御することで、物理エンジンに任せた自然な動きを実現。
FixedUpdate()
は主に物理演算を適用するオブジェクト(Rigidbody
を持つもの)に使用すると効果的です。
③ Time.fixedDeltaTime を使った物理シミュレーションの調整
Time.fixedDeltaTime
は FixedUpdate()
の実行間隔を決定します。デフォルトでは 0.02秒(50回/秒) に設定されており、ゲームのパフォーマンスや物理挙動を調整する際に役立ちます。
例えば、スローモーションを実装する場合、Time.timeScale
を変更するとゲーム全体の時間の流れを遅くできますが、物理演算の安定性を保つために Time.fixedDeltaTime
も調整する必要があります。
スローモーションを実装
using UnityEngine;
public class SlowMotionEffect : MonoBehaviour
{
public float slowMotionFactor = 0.5f; // スローモーションの倍率
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) // スペースキーでスローモーション発動
{
Time.timeScale = slowMotionFactor;
Time.fixedDeltaTime = 0.02f * Time.timeScale; // 物理演算の間隔を調整
}
if (Input.GetKeyUp(KeyCode.Space)) // スペースキーを離すと元に戻る
{
Time.timeScale = 1f;
Time.fixedDeltaTime = 0.02f;
}
}
}
解説
Time.timeScale = 0.5f;
でゲームの時間を半分の速度に変更。Time.fixedDeltaTime
をTime.timeScale
に合わせて調整することで、物理演算が正常に動作するようにする。
このコードを使えば、リアルタイムでスローモーションを切り替えることが可能になります。
まとめ
フレームレートに依存しない動作を実装するには、以下のポイントを押さえましょう: ✔ Time.deltaTime
を掛けてオブジェクトの移動速度を調整
✔ 物理演算には FixedUpdate()
を使用し、一定間隔で処理を実行
✔ Time.fixedDeltaTime
を調整し、物理演算の安定性を保つ

これらのテクニックを駆使すれば、どんな環境でも一貫したゲーム体験を提供できます!
4. 時間を制御する応用テクニック
UnityのTime
クラスを使えば、ゲーム内で時間の流れを自由に操作できます。スローモーションや加速、一時停止などの演出を加えることで、よりダイナミックなゲーム体験を提供できます。このステップでは、Time.timeScale
を活用した時間制御のテクニックを紹介します。
4.1 スローモーションや加速の実装
ゲームの演出として、スローモーション(スロー演出)や時間の加速を取り入れることは珍しくありません。Unityでは、Time.timeScale
を変更することで、簡単に時間の流れを操作できます。
スローモーションを実装する
スローモーションを実装するには、Time.timeScale
の値を1.0未満に設定します。例えば、0.5にすると通常の半分の速度になります。
void SlowMotion()
{
Time.timeScale = 0.5f; // 時間を50%に減速
Time.fixedDeltaTime = 0.02f * Time.timeScale; // 物理演算の時間も調整
}
🔹 ポイント
Time.timeScale
を小さくすると、ゲーム全体がスローになる。Time.fixedDeltaTime
も調整しないと、物理演算の挙動が変になるので注意。
時間を加速する
逆に、Time.timeScale
を1.0より大きくすると、ゲームの進行を速められます。
void SpeedUp()
{
Time.timeScale = 2.0f; // 2倍速
Time.fixedDeltaTime = 0.02f * Time.timeScale;
}
🎮 活用例
- スローモーション演出:シューティングゲームの弾丸回避シーン
- 時間加速:レースゲームでのブースト機能
4.2 一時停止機能の作成
ゲーム中に一時停止メニューを開いたとき、すべてのオブジェクトの動きを止めることができます。Time.timeScale = 0;
にすることで、ゲームの進行を完全にストップできます。
一時停止と解除を切り替える
bool isPaused = false;
void TogglePause()
{
if (isPaused)
{
Time.timeScale = 1.0f; // ゲーム再開
isPaused = false;
}
else
{
Time.timeScale = 0f; // 一時停止
isPaused = true;
}
}
⚠️ 注意点
Time.timeScale = 0;
にすると、Update()
が止まるため、UIアニメーションなども動かなくなる。Time.unscaledDeltaTime
を使うと、時間制御の影響を受けないUIのアニメーションが作れる。
一時停止中もUIを動かす
void Update()
{
float uiAnimationSpeed = 1.0f;
myUIElement.Rotate(Vector3.up * uiAnimationSpeed * Time.unscaledDeltaTime);
}
🔹 ポイント
Time.unscaledDeltaTime
を使うと、timeScale
の影響を受けない処理ができる。- 一時停止メニューのアニメーションやカウントダウンなどに活用可能。
4.3 カウントダウンタイマーの実装
ゲーム内でカウントダウンタイマーを作る場合、Time.timeScale
を調整しても影響を受けないようにするのがポイントです。
シンプルなカウントダウン
float countdown = 10f;
void Update()
{
if (countdown > 0)
{
countdown -= Time.deltaTime;
}
else
{
Debug.Log("時間切れ!");
}
}
一時停止の影響を受けないカウントダウン
通常のTime.deltaTime
を使うと、ゲームが一時停止するとカウントダウンも止まってしまいます。Time.unscaledDeltaTime
を使うと、時間を止めてもカウントダウンが継続します。
void Update()
{
if (countdown > 0)
{
countdown -= Time.unscaledDeltaTime;
}
}
🎮 活用例
- カウントダウン開始演出
- リスポーンまでの待機時間
- クールダウン時間の制御
まとめ
Time.timeScale
を変更すると、ゲームの進行速度をスローにしたり加速できる。Time.timeScale = 0;
でゲームを一時停止できるが、UIを動かすならTime.unscaledDeltaTime
を使う。Time.unscaledDeltaTime
を活用すると、一時停止中でもカウントダウンを継続できる。

これらのテクニックを活用すれば、よりダイナミックなゲーム演出が可能になります! 🎮✨
5. 実践!Timeクラスを使ったサンプルコード
ここでは、Time
クラスを活用してゲーム内の時間を管理する具体的なスクリプトを紹介します。Time.deltaTime
を使ったオブジェクトの移動、スローモーションと一時停止の実装、そしてカウントダウンタイマーの作成を行います。
① Time.deltaTimeを活用したスムーズなオブジェクト移動
ゲーム内でキャラクターを移動させる際、フレームレートが異なる環境でも一定の速度で動かすにはTime.deltaTime
を活用します。
🔹 実装方法
Update()
内でTime.deltaTime
を使用してオブジェクトを移動- プレイヤーが
WASD
キーで動けるようにする
💻 コード
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed = 5f; // 移動速度
void Update()
{
float moveX = Input.GetAxis("Horizontal"); // A, Dキー(←→)の入力
float moveZ = Input.GetAxis("Vertical"); // W, Sキー(↑↓)の入力
Vector3 move = new Vector3(moveX, 0, moveZ);
// Time.deltaTimeを使ってフレームレートに依存しない移動を実装
transform.Translate(move * speed * Time.deltaTime);
}
}
📌 解説
Input.GetAxis("Horizontal")
とInput.GetAxis("Vertical")
を使用してプレイヤーの入力を取得transform.Translate()
でオブジェクトを移動Time.deltaTime
を掛けることで、フレームレートが異なる環境でも一定速度で移動
② スローモーションと一時停止をスクリプトで制御
Time.timeScale
を変更することで、ゲーム全体の時間の流れを遅くしたり、完全に止めたりすることができます。
🔹 実装方法
T
キーを押すとスローモーション(0.2倍速)を適用P
キーを押すとゲームを一時停止(0倍速)R
キーを押すと通常速度に戻す
💻 コード
using UnityEngine;
public class TimeControl : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.T))
{
Time.timeScale = 0.2f; // スローモーション(20%速度)
}
if (Input.GetKeyDown(KeyCode.P))
{
Time.timeScale = 0f; // 完全停止
}
if (Input.GetKeyDown(KeyCode.R))
{
Time.timeScale = 1f; // 通常速度
}
}
}
📌 解説
Time.timeScale = 0.2f;
で時間の流れを20%にする(スローモーション)Time.timeScale = 0f;
で完全停止Time.timeScale = 1f;
で通常速度に戻す
⚠ 注意点Time.timeScale = 0f;
にすると Update()
が止まってしまうため、UIのアニメーションを動かしたい場合は Time.unscaledDeltaTime
を使いましょう。
③ カウントダウンタイマーの作成
ゲーム内でカウントダウンを表示するには、Time.deltaTime
を使って時間を減らしていきます。
🔹 実装方法
- カウントダウンの残り時間を変数で管理
Time.deltaTime
を使って時間を減らす- UIに表示する(
TextMeshPro
を使用)
💻 コード
using UnityEngine;
using TMPro;
public class CountdownTimer : MonoBehaviour
{
public float countdownTime = 10f; // 10秒カウントダウン
public TextMeshProUGUI timerText; // UIテキスト
void Update()
{
if (countdownTime > 0)
{
countdownTime -= Time.deltaTime; // 時間を減らす
timerText.text = "Time: " + countdownTime.ToString("F2"); // 小数点2桁で表示
}
else
{
timerText.text = "Time Over!";
}
}
}
📌 解説
countdownTime
をTime.deltaTime
で減らすことでフレームレートに依存しないカウントダウンToString("F2")
で小数点2桁まで表示- 時間が0以下になったら「Time Over!」を表示
まとめ
Time
クラスを使えば、時間を正確に管理しながらスムーズなゲームプレイを実装できます。
Time.deltaTime
を活用すればフレームレートに依存しない移動が可能Time.timeScale
を変更するとスローモーションや一時停止を実装できるTime.deltaTime
を使ったカウントダウンで正確な時間制御が可能

このスクリプトを活用して、よりダイナミックなゲームプレイを実装してみましょう!🚀
6. まとめ
この記事では、UnityのTimeクラスを使って時間を管理する方法を解説しました。ゲームの動きをスムーズにするには、フレームレートに依存しない時間管理が重要です。
特に、以下のポイントを押さえておきましょう:
Time.deltaTime
を使うとフレームレートに関係なく移動できる
→ ゲームの動きを一定に保つために必須!Time.fixedDeltaTime
は物理演算専用の時間間隔
→FixedUpdate()
で物理オブジェクトの動きを制御するのに使う。Time.timeScale
を変更するとスローモーションや一時停止ができる
→Time.timeScale = 0;
でゲームを停止し、Time.unscaledDeltaTime
を使えばUIは動かせる。Time.time
を使うとゲーム開始からの経過時間が取得できる
→ タイマーやカウントダウンを作るのに便利!

Timeクラスを正しく活用すれば、時間の制御が思いのままになります。スムーズなキャラクター移動、物理演算の安定化、時間制御を駆使して、より快適なゲームを作りましょう!
よくある質問(FAQ)
- Q
Time.deltaTime
とTime.fixedDeltaTime
の違いは? - A
deltaTime
は各フレームごとの時間差、fixedDeltaTime
は一定の物理演算の間隔。
- Q
Time.timeScale = 0;
で一時停止したのにUIが動かないのはなぜ? - A
timeScale = 0;
はUpdate()
を止めるが、Time.unscaledDeltaTime
を使えばUIの動作を維持できる。
- Qスローモーションを部分的に適用するには?
- A
Time.timeScale
を変更する代わりに、特定のオブジェクトにRigidbody
のvelocity
を調整する方法がある。