Unityでゲームの中断が出来るようにする

市販ゲームであればStartボタンを押した時にゲームの中断が出来たりします。

そこで、今回はゲームの中断が出来るようにスクリプトを組んでみようと思います。
まずは中断した時に「中断中ですよ」というのがわかるUIを作成してみます。

スポンサーリンク

中断中だとわかる為のUIを作成する

ヒエラルキー上で右クリック→UI→Panelを選びます。
Panelを選ぶとCanvasも作られます。Panelの子要素にUI→Textでテキストを作成します。

ポーズ1

上のような階層が出来上がりました。(CanvasはPauseUIという名前に変更してあります)


ポーズ2

Textのインスペクタでは表示する文字とテキストのサイズ、BestFitにチェックを入れておきます。
Alignmentも中央の真中表示にします。

Panelの色やTextの色等を変更してご自分の好きなようにカスタマイズしてください。
出来たらAssetsエリアにPauseUIをドラッグ&ドロップしてプレハブにします。

このプレハブをスクリプトから出現させる事にします。

プレハブ化が出来たらシーン上のPauseUIは削除してかまいません。

ゲームを中断させるスクリプトを作成

では次に中断をスクリプトで実装してみます。

全体を管理するスクリプトがあればそちらに記述します。このブログの流れでいくとScriptというオブジェクトに設定しているManagementスクリプト内に記述します。

変数を宣言します。表示するUIはインスペクタ上で設定出来るようにpublicで宣言しておきます。

次に実際に止める処理です。
キーボードのQを押したら中断し、再度Qを押したら再開するようにします。

Update関数でQキーが押されたかどうか判定し、押されていた場合はゲームを中断する関数GameStopを呼び出します。

GameStop関数内ではstopTimeの状態を見て、中断していなければUIインスタンスの作成とTime.timeScaleの値を0にしています。

Time.timeScaleは時間の流れるスピードで0に設定すると時間が流れなくなります。

時間が中断していた場合は再開させるのでTime.timeScaleを1にします。1は通常の時間の流れになります。

最後にフラグを反転させて、中断していなければ中断、中断していれば再開と状態を変更します。

これでゲームの中断が出来るようになりました。

ステータス画面を表示して武器を切り替えたい場合等にTime.timeScaleの値を0にすれば一時停止しながら装備を変えることが出来ます。

リアルな感じを出したい場合は装備切り替え画面になっていても時間は流したままで、敵の攻撃も受けるというのもいいかもしれません。

pause3

上が実際の画像です。

Time.timeScaleを0にするだけじゃダメ

すべてが簡単にいきそうですが、Time.timeScaleを0にした場合FixedUpdateは呼び出されなくなりますが、Update関数は呼び出されます。

つまり、FixedUpdateを使った移動やアニメーションなどの再生は止まるんですが、
Update関数内で行っているキーボードの受付やOnAnimatorIKなどはそのまま呼び出されています。

その為Update関数内の処理を行いたくない場合は条件文を追加し、

if(Time.timeScale > 0) {
何らかの処理;
}

という風に記述しておくとUpdate関数の処理もストップする事が出来ます。
全然気づかずやっていたら中断中にキャラクターがブレていたので気づきました・・・・(^_^;)

よく考えたら当たり前ですよね・・、中断させているスクリプトでQが押されたかどうかでストップしているのに、Updateまで止まってたらどうやって再開させてたんだって話に・・・・・(+_+)