UnityUnityメモ

UnityのTimeクラスを徹底解説!正確な時間管理をマスターしよう

Unity

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.deltaTimeFixedUpdate() を活用して、フレームレートに依存しない動作を実装する方法を解説します。


① 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.fixedDeltaTimeFixedUpdate() の実行間隔を決定します。デフォルトでは 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.fixedDeltaTimeTime.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を活用します。

🔹 実装方法

  1. Update()内でTime.deltaTimeを使用してオブジェクトを移動
  2. プレイヤーが 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 を変更することで、ゲーム全体の時間の流れを遅くしたり、完全に止めたりすることができます。

🔹 実装方法

  1. Tキーを押すとスローモーション(0.2倍速)を適用
  2. Pキーを押すとゲームを一時停止(0倍速)
  3. 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 を使って時間を減らしていきます。

🔹 実装方法

  1. カウントダウンの残り時間を変数で管理
  2. Time.deltaTime を使って時間を減らす
  3. 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!";
}
}
}

📌 解説

  • countdownTimeTime.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.deltaTimeTime.fixedDeltaTimeの違いは?
A

deltaTimeは各フレームごとの時間差、fixedDeltaTimeは一定の物理演算の間隔。

Q
Time.timeScale = 0; で一時停止したのにUIが動かないのはなぜ?
A

timeScale = 0;Update()を止めるが、Time.unscaledDeltaTimeを使えばUIの動作を維持できる。

Q
スローモーションを部分的に適用するには?
A

Time.timeScale を変更する代わりに、特定のオブジェクトに Rigidbodyvelocity を調整する方法がある。

タイトルとURLをコピーしました