終了ボタンを押して、パネルを表示。Yesに進むとゲームは閉じて、Noに進むとパネルが非表示。

Unityで開発したゲームを配布・販売するには、プロジェクトをビルド化します。
ビルドしたゲームを立ち上げると、フルスクリーン化して閉じるボタンがないため、ゲームを終了させることができなくて困った経験があるでしょう。
読者の方がユーザーとしてゲームをするときは、画面内にゲーム終了ボタンがあるので、ゲームを閉じることができます。
しかし、そのシステム(スクリプト)は、開発者が実装しなければいけません。

筆者も最初にビルドしたとき、エディタ上では Application.Quit() を呼んでも何も起こらず「動かない…?」と焦った経験があります。実はこのメソッドはエディタでは機能しない仕様で、ビルド後の実行ファイルでのみ動作します。この記事では、その仕様を踏まえてエディタ・ビルドの両方で正しく動作確認できる方法も合わせて解説します。
本記事では、プロジェクトの終了できない人に向けて、終了時の処理するイベントを紹介します。
- ビルドしたUnityプロジェクトのアプリ終了する方法を知りたい
- ゲーム終了システムを導入したい
- スクリプトでゲーム終了処理をしたい
Unityでゲーム終了する方法

Unityでゲーム終了する方法は開発者としてではなく、プレイするユーザー側の視点で設置しなければいけません。
ゲームの終了方法が分かりにくい。ややこしい場合は、プレイヤーは不快な気持ちになります。
しかしながら、ゲームの終了方法は、ユーザーによって異なります。
例えば、タイトル画面にあるボタンで終了。スマホの場合、アプリのタブを廃棄して終了。PCの場合、コマンドキーを使って終了。
色々な終了パターンでセーブを保存できるようにしないと、データが消滅してしまいユーザーが離れる原因になります。
開発者はあらゆる終了パターンを想定して、セーブシステムを作らなければいけません。
iOS・Android・WebGLなど、配信先プラットフォームによって終了ボタンの扱いは大きく異なります。次のセクションで詳しく解説します
プラットフォームごとの終了ボタンの扱い
| プラットフォーム | 終了ボタンの扱い | 理由 |
|---|---|---|
| Windows / Mac(スタンドアロン) | 設置するのが一般的 | OS側に明確な終了操作がない場合がある |
| iOS | 設置しないのが推奨 | Appleの審査ガイドラインで終了ボタンの実装が非推奨とされている(ホームボタン・スワイプでの終了が前提) |
| Android | 設置してもよい | OS標準の戻る操作と併用されることが多い |
| WebGL | Application.Quit は機能しない | ブラウザのタブ・ウィンドウを閉じる操作に依存するため、終了処理自体が不要 |
iOS向けにリリースする場合、終了ボタンを設置するとApple審査でリジェクトされる可能性があります。配布先プラットフォームを決めた上で、終了ボタンの実装方針を検討してください。
参考(Unity公式ドキュメント):https://docs.unity3d.com/ja/2021.1/ScriptReference/Application.Quit.html
ショートカットキー(開発者向け)
Unityでビルドしたゲームを最も簡単に終了する方法は、ショートカットキーを使用することです。
「ALT」+「F4」
2つのキーを同時押しすることで、閉じることができます。

例えばWindowsで保存する場合は、「Ctrl」+「S」を同時押しします。
CtrlキーはCmdキーに相当するので、Macで保存する場合は「Cmd」+「S」の入力で同じ処理がされます。
WindowsでのAltキーは、MacのOptionキーに相当します。
しかし、「Option」+「F4」でゲームを終了できません。
Macには、Windowsのように閉じるコマンドキーは設定されていません。
その他にも、次のウィンドウを選択「Ctrl + Tab」や前のウィンドウを選択「Ctrl + Shift + Tab」などのコマンドがMacにはありません。
しかし、コマンドの少なさからUnityはwindowsの方が相性がよいというわけではありません。
iPhone向けのゲーム・アプリを作るには、Macがないと開発・公開できません。
ショートカットキーによる終了は、Unityを開発している人しか知らないものです。
さらに、普段からコマンド入力をしていなければ、開発者でも知らないことでしょう。
したがって、ショートカットでゲームを終了させることをメインにするのはやめましょう。
UIボタンでアプリ終了するスクリプト

UIボタンを使った終了であれば開発者だけではなく、ゲームをするユーザーにも認知されるので、こちらを使うことをおすすめします。
ボタンを使って関数を実行するにはスクリプトを作成する必要があります。
アプリケーション(ビルドしたゲーム)を終了させる方法は簡単で、Application.Quitを使用するだけです。
Application.Quit() はエディタ上では動作しません。Unityエディタの再生(Play)モードでテストする場合は、後述の #if UNITY_EDITOR を使った対応コードが必要です。これに気づかず「動かない」とハマる開発者が多いポイントです。
using UnityEngine;
public class QuitGame : MonoBehaviour
{
void Update()
{
if (Input.GetKey("space"))
{
Application.Quit();
}
}
}
この例ではUpdateメソッドでspaceキーが押されたときに、Application.Quit()メソッドを呼び出しています。これはエディタ上では動作せず、ビルドしたアプリケーションでのみ機能します。
確認できるように、スペースキーを押下すると、ビルドしたゲームは終了します。

このApplication.Quitを使ってUIボタンを押すと、ゲームを終了するスクリプトを書きます。
ソースコード
using UnityEngine;
public class QuitBtn : MonoBehaviour
{
public void Click() {
Application.Quit();
}
}解説
ボタンがクリックされたときに呼び出したいので、publicでClickメソッドを作成してください。
Click メソッド内で呼び出されると、
Applicationクラスの Quitメソッドを呼び出し、アプリケーションを終了します。
実演
HierarchyウィンドウからUIボタンを追加してください。
UIボタンを選択し、Inspectorウィンドウの「On click」でClickメソッドをアタッチしてください。

Applicationクラスの Quitメソッドは、ビルドしたプロジェクトのみで動くので、ビルドしてください。
ビルドしたプロジェクトを立ち上げて、表示されたボタンを押してください。
終了されると、スクリプトは正常に動作しています。

終了確認のウィンドウを表示

UIボタンで終了を実装できましたが、うっかりゲームを終了するボタンを押してしまうことがあります。押し間違いで何度もゲームを開いているとユーザーからすればストレスに感じます。
そこで、終了確認するウィンドウ(パネル)を表示して、「YES」の押下でゲームを閉じる。
「NO」の押下でゲームを続けるようにします。
ソースコード
using UnityEngine;
using UnityEngine.UI;
public class QuitGame : MonoBehaviour
{
public GameObject quitPanel;
public GameObject quitButton;
public Button yesButton;
public Button noButton;
private void Start()
{
quitPanel.SetActive(false);
// ボタンにリスナーを追加
yesButton.onClick.AddListener(QuitGameYes);
noButton.onClick.AddListener(QuitGameNo);
}
// クリックされたときに呼び出されるメソッド
public void OnQuitButtonClick()
{
quitPanel.SetActive(true);
quitButton.SetActive(false);
}
// Yesボタンがクリックされたときに呼び出されるメソッド
public void QuitGameYes()
{
Application.Quit();
}
// Noボタンがクリックされたときに呼び出されるメソッド
public void QuitGameNo()
{
quitPanel.SetActive(false);
quitButton.SetActive(true);
}
}解説
初めに名前空間を定義します。
UIボタン・パネルを使用するので、using UnityEngine.UI;を追加してください。
using UnityEngine;
using UnityEngine.UI;Inspectorで編集可能にするために、publicな変数として、「quitPanel」・「quitButton」 ・「yesButton」・「noButton」を指定します。
「quitPanel」・「quitButton」は表示・非表示でSetActiveを使いたいので、GameObject。
「yesButton」・「noButton」はAddListenerで、ボタンにリスナーを追加してメソッドを実行したいので、Button。
public GameObject quitPanel;
public GameObject quitButton;
public Button yesButton;
public Button noButton;Start()メソッドでは、終了確認ダイアログを非表示にし、YesボタンとNoボタンにそれぞれ終了処理と非表示処理を関連付けるリスナーを追加します。
private void Start()
{
quitPanel.SetActive(false);
yesButton.onClick.AddListener(QuitGameYes);
noButton.onClick.AddListener(QuitGameNo);
}OnQuitButtonClick()メソッドは、終了ボタンがクリックされたときに呼び出されるメソッド。
終了確認ダイアログを表示し、終了ボタンを非表示にします。
public void OnQuitButtonClick()
{
quitPanel.SetActive(true);
quitButton.SetActive(false);
}
QuitGameYes()メソッドは、Yesボタンがクリックされたときに呼び出されるメソッド。
Application.Quit()を呼び出してゲームを終了します。
public void QuitGameYes()
{
Application.Quit(); // アプリケーションを終了する
}QuitGameNo()メソッドは、Noボタンがクリックされたときに呼び出されるメソッドで、OnQuitButtonClick()メソッドとは対の関係にあります。
終了確認ダイアログを非表示にし、終了ボタンを再表示します。
public void QuitGameNo()
{
quitPanel.SetActive(false); // 終了確認ダイアログを非表示にする
quitButton.SetActive(true); // 終了ボタンを再表示する
}実演
Hierarchyウィンドウにパネルを設置してください。
Inspectorウィンドウにスクリプトをアタッチしてください。
パネルの配置後、終了ボタン、パネル。
パネルに従属するYESとNOボタン2つをそれぞれアタッチしてください。

次に、終了してパネルを呼び出すように、終了ボタンのOnClickをアタッチしてください。

実行をすると、冒頭で紹介したように終了ボタンを押すと、パネルが出現。
YESを押すと、ゲームが終了。NOを押すと、パネルが非表示になります。
終了時のイベントでセーブ処理を呼ぶ(OnApplicationQuit)
ここまではボタン操作による明示的な終了処理を紹介しましたが、実務ではショートカットキーやOS側の操作で終了されたケースにも対応する必要があります。
そのために使えるのが、Unityが用意している終了時イベントの OnApplicationQuit です。
using UnityEngine;
public class GameQuitHandler : MonoBehaviour
{
// アプリケーションが終了するときに自動で呼び出される
private void OnApplicationQuit()
{
// ここでセーブ処理を呼ぶことで、終了経路を問わずデータを保存
SaveData();
}
private void SaveData()
{
Debug.Log("終了直前にセーブ処理を実行しました");
}
}OnApplicationQuit は、UIボタンからの Application.Quit() 呼び出しだけでなく、ALT+F4などのショートカットキーやOSのタスク終了でも呼び出されます。そのため、終了確認パネルを実装していても、ボタンを使わずに終了されるケースに備えてセーブ処理をここに集約しておくと安全です。
スマートフォン(iOS/Android)では、ホームボタンでアプリをバックグラウンドに送った時点で OnApplicationPause が呼ばれ、OnApplicationQuit が呼ばれない場合があります。モバイル向けには OnApplicationPause でもセーブ処理を呼ぶようにしておくと安心です。
さらに、終了処理自体をキャンセルしたい場合(未保存データがある場合の確認など)には Application.wantsToQuit イベントも活用できます。
using UnityEngine;
public class QuitCanceler : MonoBehaviour
{
private void Start()
{
Application.wantsToQuit += OnWantsToQuit;
}
private bool OnWantsToQuit()
{
// falseを返すと終了処理がキャンセルされる
bool canQuit = true; // 未保存データの有無などをここで判定する
return canQuit;
}
}参考(Unity公式ドキュメント):https://docs.unity3d.com/ja/2021.1/ScriptReference/Application-wantsToQuit.html
セーブデータの実装方法は別記事で詳しく解説しています。
まとめ
Unityでゲームを終了するには、Application.Quitを使います。
プロジェクトを閉じやすくすることは、ユーザーがゲームに対して好印象を持つ大事な要素になります。
ゲームの終了方法はさまざまあり、閉じ方はユーザーごとに異なります。
あらゆる手段を想定して、セーブデータが損失しないように開発をしてください。





