時を止める方法3選

時を止める 方法3選

この記事では、時を止めたい、でもどうすればいいか分からない!
そんな時にきっと重宝する記事です。
時を止める方法を3選、記しておきたいと思います。

[目次]
Time.timeScale
オブジェクトのアクティブ/非アクティブ状態を変更する
動作を制御するフラグを使用する
まとめ

時を止める方法①-Time.timeScale

Time.timeScale = 0f; // 時間を停止
Time.timeScale = 1f; // 時間を通常速度に戻す

このコードを、時を止めたい場面で使うと便利です。
メニュー画面を開いている時や、ゲームオーバー画面などで使用すると良いです。

Time.timeScaleは、ゲーム内の時間の進行速度を制御するための変数です。
この値を0に設定すると、ゲーム内の時間が停止します。
ただし、この方法はゲーム内の全ての動作、アニメーション、物理演算などに影響を及ぼすことに注意。

個人的に使いどころとしては、メニュー画面を開いているときに重宝します。
弾幕ゲームの弾幕もその場で止まってくれます。
メダルゲームのプッシャー動作なども止まります。


時を止める方法②-オブジェクトのアクティブ/非アクティブ状態を変更する-

// 特定のオブジェクトを非アクティブにする
gameObject.SetActive(false);

// 非アクティブなオブジェクトを再びアクティブにする
gameObject.SetActive(true);

特定のオブジェクトやコンポーネントをアクティブまたは非アクティブにすることで、そのオブジェクトやコンポーネントによる時間依存の振る舞いを制御できます。

オブジェクト自体を非アクティブにすると、そのオブジェクトにアタッチされたスクリプトやアニメーションが動作しなくなります。
SetActive()を使う事で、オブジェクト自体はScene上に残っているので、再び再利用することが出来ます。

①のやり方で時を止めてしまうと、全ての時間に関する動作が動かなくなってしまいます。
特定のオブジェクトの場合は、アクティブ/非アクティブを使ってみると良いでしょう。

因みにオブジェクト自体をScene上から消したい場合は、Destroy()を使用。

※gameObjectと記述すると、スクリプトがアタッチされているオブジェクトが指定されます。
別のオブジェクトを指定したい場合はStart()や、実行直前で指定してください。


動作を制御するフラグを使用する

public bool timeIsStopped = false;

void Update()
{
    if (!timeIsStopped)
    {
        // 時間が止まっていない場合の処理
    }
}

3つ目の方法は、ゲーム内で特定の動作やアクションを実行する際に、制御用のフラグを使う事です。
このフラグを使用して、特定のコードブロックを実行するかどうかを判断します。
例えば演出シーンで全てのオブジェクトの操作が出来ないようしたい場合はこのフラグを使うと便利です。
フラグが立っている場合は、操作が出来ない、攻撃をしないようにしたりすることが出来ます。

後から追加する場合もif文で囲ってあげるだけなので、修正もしやすいと思います。


まとめ

これらの方法を組み合わせることで、ゲーム内で時間を止めることができます。
どの方法を選ぶかは、ゲームの要件やデザインによって異なる場合があります。

Time.timeScaleは使い方によってはとても便利です。
0fにしなくても、一定の条件でスローモーションにしたい場合でも重宝します。(サウンドとかも遅くなるのかな…?)

と言うわけで皆さん、また次回!