今回はゲーム開発で必須の機能に関する話題で、タイトルの通り
をご紹介するという内容になっています。
Unityでゲームを作っているとポーズ画面を作りたくなることがあるのですが、Unityには直接ゲームの流れを止める機能はないので初心者の方からしたら「一体どうやってゲームを一時停止させたらいいんだろう?」と悩んでしまいますよね。
そこでここでは「簡単に作れるポーズ画面」の作り方を丁寧にご説明していきますね。
Unityでゲームを一時停止させる方法
では、まずはUnityでゲームを一時停止させる方法をご紹介しようと思います。先ほども書いた通りUnityにはゲーム内から直接ゲームを停止・再開させる機能はないのですが、その代わり時間の流れをコントロールすることで一時停止を実現することができます。
Time.timeScaleの値を変更してゲーム内時間の速度を変更する
具体的には、時間の流れをコントロールするにはTimeクラスの「timeScale」という変数の値を変更します。次の例をご覧ください。
Time.timeScale = 2;
このtimeScaleのデフォルトの値は「1」ですが、これを例えば上のように「2」にするとゲーム内の時間の流れが2倍になります。つまり早送りになるというわけですね。逆にこの値を「0.5」にすればスロー再生になりますし、「0」にするとゲーム内の時間の流れが停止します。
というわけで、ポーズ画面を実装するにはtimeScaleの値を0にすればOKです。
Time.timeScale=0にしたときの注意点
ただしこのtimeScaleを0にしたときの挙動として次の注意点があります。
- FixedUpdate関数は呼び出されなくなるが、Update関数は通常通り呼び出される
- Time.deltaTimeはゼロになる
まずtimeScaleを0にすると、FixedUpdate関数は呼び出されなくなるのでその中に書いてある処理はスキップされます。しかしその一方でUpdate関数はそのまま呼び出され続ける点には注意が必要です。つまりtimeScaleを0にしたからといってすべての処理が停止するわけではないことにご注意ください。
また、timeScaleを0にするとTimeクラスの変数であるdeltaTimeも0になります。Updateは動き続けるのにdeltaTimeは0になるというのもなんか変な気がするかもしれませんが、これによってUpdate関数内でゲームオブジェクトを移動させる場合、移動力にdeltaTimeを掛けていればポーズしたときに移動も停止することになります(下記スクリプト参照)。
void Update() { // 次の移動処理はtimeScale=0で停止する transform.position += speed * Time.deltaTime; }
ポーズ画面の作り方
それでは基本的な仕組みをご理解頂いたところで本題のポーズ画面の作り方についてご説明します。
動作サンプル
まずは動作サンプルをご覧ください。
「Pause」ボタンを押すとゲームが一時停止されているのが分かると思います。
ポーズ(一時停止)用のC#スクリプト
ポーズ用のC#スクリプトはとても簡単で、次のような内容になっています。
using UnityEngine; public class Pause : MonoBehaviour { public void PauseGame() { Time.timeScale = 0; } public void ResumeGame() { Time.timeScale = 1; } }
ポーズ画面のUIの作り方
最後にポーズ画面のUIとその呼び出しボタンを作るには次の作業を行います。
ポーズ画面呼び出しボタン
まずポーズ画面を呼び出すボタンを作るには、新しいボタンを作って先ほどのPauseスクリプトをアタッチし、
- PauseGame関数を登録
- 後述するポーズ画面のゲームオブジェクトをアクティブ化する処理を登録
すればOKです。
ポーズ画面の作成
ポーズ画面を作るには、新しいキャンバスを作ってボタンなどを配置し…
このボタンに、先ほどのPauseスクリプトをアタッチして「クリック時」のイベントに
- ResumeGame関数を登録
- ポーズ画面のキャンバスを非アクティブにする処理を登録
するだけです。
おわりに
以上、簡単ではありますがUnityでポーズ画面を作る方法についてご説明しました。
ポーズ画面を作っておけばプレイヤーさんが好きなときにゲームを一時停止できるので、よりユーザーフレンドリーになってゲームに対する印象がよくなります。ぜひ上記の内容を参考にしていただき、ポーズ画面をご自身のゲームに実装していただければと思います。
この記事がUnityでのゲーム開発のお役に立てば幸いです。