Unityに関連する記事です

ゲーム終了処理を追加する方法


 特定のボタン(PCだとESCボタンなど)を押した際に、ゲームを終了させる方法を設計し、実装していきます。
ゲームを終了させる機能にはUnityの用意しているApplication.Quitメソッドを利用します。
このメソッドを呼び出す際には、基本的には2つの方法が考えられます。

1.ボタンを押したら、すぐにゲームを終了する方法(各シーンごとにスクリプトに用意する)
2.ボタンを押したら、ゲーム終了を確認するポップアップが開いて、その中でさらにボタンを押すことでゲームを終了する方法

 今回は1と2の両方の手順を順番に紹介します。

 Application.Quitメソッドについては公式情報もご確認ください。
Unity公式スクリプティング・マニュアル
Application.Quit
https://docs.unity3d.com/ScriptReference/Applicati...

1.ボタンを押したら、すぐにゲームを終了する方法(各シーンごとにスクリプトに用意する)


 ゲームを実行しているシーンに存在しているいずれかのスクリプトのUpdateメソッドに、以下の処理を追加します。
もしもスクリプト内にUpdateメソッドがない場合にはUpdateメソッド自体を追加しましょう。
Updateメソッドがある場合には、if以下の処理を追加します(間違えてUpdateメソッドを2つ作らないようにしてください。)

 どのスクリプトのUpdateメソッドに追加しても構いませんが、ゲーム管理に関わる処理ですので、GameMaster、GameManager、GameDirectorといった
ゲームの種類に応じた管理用などのスクリプトに追加しておくとよいと思います。


void Update()
{
    if (Input.GetKeyDown(KeyCode.Escape)) {
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;   // UnityEditorの実行を停止する処理
#else
        Application.Quit();                                // ゲームを終了する処理
#endif
    }
}

<スクリプト補足>

 #if,#else,#endif は、ゲームの実行環境(プラットフォーム)に応じて処理を分岐する処理です。
上記の場合であれば、UnityEditor(開発環境)と、それ以外(WebGL、スマホ端末、PC)の環境によって、ゲーム終了の処理が自動的に分岐されて終了するようになっています。

 if文の条件で使用している「KeyCode.Escape」ですが、キーボードの場合にはESCボタン、アンドロイド端末の場合にはバックキー(戻るボタン)がこちらの処理の対象となります。
そのため、この一文の条件で、スマホ端末にも対応することが出来ます。 


 この実装方法にも少々問題点があり、例えば、シーンが3つあるような場合には、それぞれのシーンの各スクリプトにこの処理を追加しないとなりません。
(Title,Game,Resultとシーンがあるのであれば、Titleシーンにある1つのスクリプトに処理を追加、Gameシーンにある1つのスクリプトに処理を追加、というように)

 ゲームシーンが1つしかないような場合や、デバッグ用にゲーム終了処理を試してみたい場合にはこの実装方法でもよいと思いますが、
複数のシーンでゲーム終了を対応したい場合には不便ですので、ゲーム製作に慣れてきましたら別の実装方法も検討してみましょう。

2.ボタンを押したら、ゲーム終了を確認するポップアップが開いて、その中でさらにボタンを押すことでゲームを終了する方法


 設計としましてはESCボタン(バックボタン)を押した際に、すぐにゲームを終了するのではなく
ポップアップを開いて、その中でゲームの終了か、ゲームに戻るかを選択できるようにボタンを用意します。

 ゲームの終了を選択することでゲームが終了となり、ゲームに戻るを選択した場合にはポップアップを閉じて(破壊して)ゲームを再開します。

 ポイントとしては、ポップアップが開く(生成される)と同時に、ゲームの進行が一時停止する処理を加えている点です。
この処理がないと、ポップアップが開いている裏側でゲームが進行してしまい、予期していない挙動になってしまいます。

 そのため、ポップアップが開いている間はゲームの進行がストップし、ゲームを再開する場合には、再度ゲームの進行を再開するように処理を行います。

 実装の手順です。
1.ゲーム終了確認用ポップアップを作成する
2.ゲーム終了確認用ポップアップにアタッチするスクリプトを作成する
3.2のスクリプトを1のゲームオブジェクトにアタッチし、情報をアサインしてからプレファブにする
4.管理用スクリプトにゲーム終了確認用ポップアップを生成する処理を追加する
5.4のスクリプトがアタッチされているゲームオブジェクトにゲーム終了確認用ポップアップのプレファブをアサインして登録する


1.ゲーム終了確認用ポップアップを作成する


 色々なコンポーネントを持つゲームオブジェクトを組み合わせて、ゲーム終了確認用のポップアップ・ゲームオブジェクト(以下、ポップアップ)を作成します。

 このポップアップはCanvasの中に生成されるようにしますので、まずはヒエラルキーにCanvasを作成します。すでにある場合にはそれを利用します。

 Canvas上でメニューを表示して Create Empty を選択し、名前を QuitCheckPopUp に変更します。これはフォルダ代わりに利用します。


 その後、QuitCheckPopUpの子オブジェクトとして、Image(UI => Image)、Text(UI => Text)、Create Empty の3つのゲームオブジェクトを作成します。

 Imageの名前は imgBackGround に変更します。これはポップアップの背景画像の設定用に利用します。自由なイメージを設定してください。(例ではUnityのBackGroundイメージを設定)



 Textの名前は、txtMessage に変更します。Textコンポーネント内のTextプロパティ欄に「ゲームを終了しますか?」と入力し、画面に確認用メッセージを表示させます。


 
 Create Emptyの名前は Buttons に変更します。これはボタンを入れるためのフォルダ代わりに利用します。


 Buttonsの子オブジェクトとして、Button(UI => Button)のゲームオブジェクトを2つ作成します。名前はそれぞれ btnQuitGame 、btnClosePopUp に変更します。

 btnQuitGameゲームオブジェクトの子であるTextのTextプロパティ欄には「終了する」と入力します。

 btnClosePopUpゲームオブジェクトの子であるTextのTextプロパティ欄には「ゲームに戻る」と入力します。
どちらも文字の大きさ、フォント、位置などは適宜設定します。

 以下に、ヒエラルキーでの状態と、各ゲームオブジェクトのインスペクターの画像を添付しますので、参考にしてください。
 
ヒエラルキー

QuitCheckPopUp

btnQuitGameと、子のText





btnClosePopUpと、子のText





2.ゲーム終了確認用ポップアップにアタッチするスクリプトを作成する


 1で作成したポップアップにアタッチするためのスクリプトを作成します。名前もポップアップと同じにしておきます。

QuitCheckPouUp.cs

 <= クリックすると開きます


3.2のスクリプトを1のゲームオブジェクトにアタッチし、情報をアサインしてからプレファブにする


 1のポップアップに、2のスクリプトをアタッチしましょう。インスペクターを確認し、必要な情報をアサインします。
Buttonコンポーネントを2つ登録できますので、それらを同じ名前の場所にドラッグアンドドロップしてアサインします。

参考動画
https://gyazo.com/bf5113a2d52b12bdd04b19490133f422

 無事にアサインできたら、このポップアップをプレファブにします。
(Canvasごとプレファブにするのではなくて、Canvasの子であるQuitCheckPopUpゲームオブジェクトをプレファブにします。)
プレファブ化したら、ヒエラルキーからは削除しておきます。

4.管理用スクリプトにゲーム終了確認用ポップアップを生成する処理を追加する



 すでにある管理用スクリプトで対応してください。どちらでも問題ありません。そういった管理用のスクリプトがない場合にはGameDirectorスクリプトを作成して、処理を書いてください。

GameDirector(あるいは、GameMasterがあるのであれば、そちらに記述してください)

 <= クリックすると開きます

5.4のスクリプトがアタッチされているゲームオブジェクトにゲーム終了確認用ポップアップのプレファブをアサインして登録する


 管理用のスクリプトがアタッチされているゲームオブジェクトのインスペクターを確認してください。
先ほど4で処理を追加したため、アサイン情報が2つ追加されています。

 1つは、Project内のプレファブにしたポップアップをドラッグアンドドロップしてアサインします。
 もう一つはこのポップアップを生成する位置を登録します。ヒエラルキーにあるCanvasゲームオブジェクトをドラッグアンドドロップしてアサインします。




 以上で完成です。

 まずは、2の手順で QuitCheckPopUp スクリプト内のコメントアウトしてある処理のコメントアウトを解除してください。

 ゲームを実行して、ESCボタンを押してみてください。ポップアップが生成されれば成功です。
このとき、ゲーム内の処理が一時ストップ状態になっているかも確認してください。

 それぞれのボタンを押して、ゲーム終了が正常に終了するか、ちゃんとポップアップが破壊されてゲームが再開されるかどうか、を確認します。

<実装動画(画面に表示されている時間の経過が一時ストップし、再開するのがわかると思います。)>
https://gyazo.com/56a637b9354fe701922120a4836ad847


【修正してみましょう】

 この状態のままですと、ポップアップを開いている際に再度ESCボタンを押すと、さらに追加のポップアップが開いてしまいます。
常に1つしかポップアップを生成しないようにするにはどうすればいいか、考えて実装をしてみましょう。

 実装例を提示しておきます。他にも方法はありますので、ご自分の考えで実装をしてから確認してみてください。


GameDirector(あるいは、GameMasterがあるのであれば、そちらに記述してください)



<応用>シーン遷移しても破棄されないゲームオブジェクトを作成し、ゲームを終了する処理を用意する方法


 1と2の処理の両方を自動で分岐する処理を持ったスクリプトを作成し、そのスクリプトに、シーン遷移しても破棄されないゲームオブジェクトを作成する処理を記述します。
こうすることで、いずれのゲームシーンにもゲーム終了の命令を呼び出せるゲームオブジェクトを常に配置して、そのスクリプトがゲーム終了処理を専用で受け持つようにする設計です。

QuitGameManager.cs

 <= クリックすると開きます。


 スクリプトを作成したら、次に、ゲームを開始するシーン(Titleなど)のヒエラルキー上に UI => Canvas でCanvas ゲームオブジェクトを作成し、名前をQuitGameManagerに変更します。
QuitGameManagerゲームオブジェクトに、いま作成したQuitGameManagerスクリプトをアタッチします。
これでこのゲームオブジェクトは、シーン遷移をしても破棄されずに、ゲームシーンに残るゲームオブジェクトになります。

 QuitGameManager ゲームオブジェクトのインスペクターにおいて、QuitCheckPopUp スクリプトを確認してください。
アサイン情報が2つ表示されていますので、順番にアサインします。
 
 quitCheckPopUp 変数には、Prefabs フォルダにある QuitCheckPopUp ゲームオブジェクトをドラッグアンドドロップしてアサインしてください。
 canvasTran 変数に、QuitGameManager ゲームオブジェクトの Canvas コンポーネントをドラッグアンドドロップしてアサインしてください。


 ゲームを起動し、Titleシーンが始まると、シーンと同じマークのDontDestroyOnLoadがヒエラルキーに追加され、そのシーンを開くと
このゲームオブジェクトがそちらに含まれていることが分かります。この状態になっていれば成功です。Titleから次のシーンへ遷移しても
このDontDestroyOnLoad内にあるゲームは破棄されずに残ります。

 そのため、いずれのシーンにもQuitGameManagerゲームオブジェクトが存在するようになり、そのゲームオブジェクトに
ゲーム終了処理が記述されていますので、どのシーンからでもEscキー(スマホの戻るボタン)を押すことでゲームを終了(あるいは終了確認のポップアップが開く)する処理が実装できます。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます