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

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

そこで、今回はゲームの中断が出来るようにスクリプトを組んでみようと思います。

まずは中断した時に「中断中ですよ」というのがわかるUIを作成してみます。

ポーズUIのサンプル

↑はポーズ中か解りやすくする為、時間経過の表示を行っていますが今回の記事ではやりません。

時間の計測については

Unityのゲームに経過時間、制限時間を表示するUIを作成します。ゲームで使用する経過時間の作成と、何らかの行動を制限する為の制限時間を表示する機能を作成していきます。

を参照してください。

スポンサーリンク

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

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

ポーズ1

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

ポーズ2

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

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

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

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

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

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

PauseScriptを作成しMainCamera等のゲームシーンで常にアクティブで存在しているゲームオブジェクトに取り付けます。

UpdateメソッドでQキーが押された時にUIのプレハブがインスタンス化されていなければインスタンス化を行います。

Time.timeScaleを0にし、ゲームの流れを止めます。

すでにUIがインスタンス化されていればUIのインスタンスを削除します。

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

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

今回のポーズ機能のサンプルのヒエラルキーは、

ポーズ機能のサンプルのヒエラルキー

↑のようになります。

MainCameraにPauseScriptを取り付け、プレハブ化したPauseUIを設定します。

MainCameraにPauseScriptを取り付けて設定

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

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

pause3

上が実際の画像です。

あらかじめPauseUIをヒエラルキーに置いておく方法

PauseUIをプレハブからインスタンス化するのではなく、あらかじめヒエラルキー上に非表示の状態で置いておき、それをオン・オフするというやり方もあります。

あらかじめPauseUIをヒエラルキーに設置

↑のようにPauseUIをヒエラルキー上に配置しておき、PauseUIのインスペクタでチェックをを外し非表示にしておきます。

MainCameraにPauseScript2を作成し取り付けます。

PauseScript2にPauseUIゲームオブジェクトを設定します。

ポーズUIをオンオフするスクリプトをMainCameraに取り付け

こちらの方がインスタンス化するよりわかりやすいかもしれません。

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

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

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

その為Updateメソッド内の処理を行いたくない場合は条件文を追加し、

という風にUpdateメソッドの最初でTime.timeScaleが0だった時はその後の処理を何もしないようにしておきます。

全然気づかずやっていたら中断中にキャラクターがブレていたので気づきました・・・・(^_^;)

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

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. アワリティア より:

    Qキーが押されたときをButtonが押されたときに変えたいのですがやり方を教えていただけないでしょうか。

    • UIのButtonが押された時にUIのPausePanelをオン・オフするというやり方がいいかもしれません。

      プレハブのPauseUIを使うとボタンと被って面倒臭い事になるので、あらかじめヒエラルキー上にPause画面等を含めたCanvasを配置しておきます。

      ポーズテストの階層

      ↑のようにCanvasの子要素にPanelを作成し、名前をPausePanel、同じ階層にUIのButtonを配置します。

      CanvasにはPauseTestスクリプトを作成し取り付けます。

      UpdateメソッドでTime.deltaTimeが止まっているか確認しています。

      Pauseメソッドはボタンを押した時に実行したいのでpublicを付けておきます。

      CanvasのインスペクタでpausePanelにPausePanelゲームオブジェクトをドラッグ&ドロップしておきます。

      ポーズテストのCanvasの設定

      ButtonのインスペクタのOn ClickでCanvasに取り付けたPausePanelスクリプトのPauseメソッドを呼び出すようにします。

      ポーズテストのボタンの設定

      これで完成です。

      ポーズテストの実際の画面

      • アワリティア より:

        教えていただきありがとうございます。
        これをやると音楽って止められますか?

        • 音声を止めるのはまた別にやらなければいけません。

          Audio SourceコンポーネントをPauseTestスクリプトと同じCanvasに設定しBGMを流しているとすれば、

          で時間を止めている時にAudio SourceのPauseメソッド、再開した時はUnPauseメソッドを呼び出せば音声の再生もポーズする事が出来ます。

  2. きなぎ悠 より:

    いつもお世話になっております。
    今この記事を見ながら勉強をしていたのですが、「ゲームを中断させるスクリプトを作成」のところで”q”キーを押してもエラーが出てしまいます。
    「PauseScriptを作成しMainCamera等に取り付けます。」とありますが、MainCamera以外のどれに取り付けるのでしょうか?

    • 記事に修正を加えました。

      ポーズUIのインスタンス化の他にポーズUIのアクティブ、非アクティブを切り替えるやり方も載せています。

      PauseScriptはMainCameraを削除したり非アクティブにしなければMainCameraに取り付けで大丈夫だと思います。

      Qキーを押した時のエラーはインスペクタでpauseUIのプレハブが設定されていない可能性があります。