Unityでゲームを作っていると、ふと「どうやってゲームを終了させるんだっけ?」と迷う瞬間があります。
ビルド後なら「×ボタン」で閉じられるけど、プレイ中のボタンやキー操作で終了させたいことも多いですよね。
今回は、わたしが実際に試した「Unityでゲームを終了する方法」を整理してみました。
「エディタでは止まらない」「ボタンが効かない」「強制終了になる」など、意外とハマりやすい落とし穴もあるので、再現手順と注意点をあわせて紹介します。
基本の終了処理:Application.Quit()とEditorApplication.isPlaying
まず、Unityでアプリを終了する代表的なメソッドはApplication.Quit()です。
ただしこれは、ビルド後の実行ファイルでしか動作しません。
Unityエディタで実行しても止まりません。
エディタでプレイモードを止めるには、別の書き方が必要です。
よく使われるのが、条件付きコンパイルで「エディタ」と「ビルド後」を切り替える方法です。
using UnityEngine;
public class QuitExample : MonoBehaviour
{
public void QuitGame()
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false; // エディタ再生停止
#else
Application.Quit(); // ビルド後アプリを終了
#endif
}
}
この書き方のポイントは「#if UNITY_EDITOR ~ #else ~ #endif」の部分。
ビルド時にはUnityEditorの部分はコンパイルされず、Application.Quit()だけが残ります。
そのため、「エディタでも止まるけどビルドでも動く」という便利な構成になります。
ちなみに、Application.Quit()はモバイルアプリでは無視されることがあります(特にiOS)。
Appleのガイドライン上、ユーザーが操作で終了できない設計が推奨されているためです。
ボタンで終了する方法:UI連携の手順
いちばん自然なのは、UIの「終了ボタン」を押したらゲームを閉じるパターン。
メニュー画面やタイトル画面など、明示的に「終了」を置きたいときに使います。
手順は以下の通りです。
- ヒエラルキーで「GameObject > UI > Button」を作成
- ButtonのTextを「終了」や「Exit」に変更
- 上記の
QuitExampleスクリプトをCanvasなどにアタッチ - Buttonの
On Click()イベントに対象オブジェクトを登録し、関数をQuitExample.QuitGame()に設定
これで、プレイ中に「終了ボタン」を押すとゲームが終了します。
エディタ上では再生が止まり、ビルド後はアプリが閉じます。
わたしの環境(Unity 2022.3 / Windows)でも正常に動作しました。
ただしWebGLビルドではApplication.Quit()が無効なので、別の挙動(メニューに戻るなど)を設定するのが良いです。
キー操作でゲームを終了させる:Escapeキー編
「終了ボタンを押すのは面倒だから、Escキーで閉じたい」というケースもありますよね。
特にテストプレイ中はマウス操作より早いので、わたしもよく使います。
using UnityEngine;
public class EscapeQuit : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
}
}
このコードを空のGameObjectにアタッチするだけで、Escキーで終了できます。
一度押すと即終了するので、ユーザー向けゲームでは「確認ダイアログ」を出す方が安心です。
ちなみに、Input.GetKey()ではなくInput.GetKeyDown()を使うのは、押しっぱなしで連続終了しないためです。
こういう細かい挙動は実際にプレイしてみると違いがよくわかります。
終了確認ダイアログを出す:誤操作対策
次に、「終了ボタンを押したら確認ウィンドウを出す」パターンです。
これを入れるだけで、UIの完成度がぐっと上がります。
最初にPanelを作成し、確認メッセージと「はい」「いいえ」ボタンを配置します。
初期状態ではSetActive(false)で非表示にしておき、終了リクエスト時だけ表示します。
using UnityEngine;
public class QuitWithDialog : MonoBehaviour
{
public GameObject confirmPanel;
public void RequestQuit()
{
confirmPanel.SetActive(true);
}
public void QuitGame()
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
public void CancelQuit()
{
confirmPanel.SetActive(false);
}
}
「終了ボタン」にはRequestQuit()を、「はい」にはQuitGame()、
「いいえ」にはCancelQuit()を割り当てます。
これで誤タップや誤クリックを防げます。
個人的には、これをタイトル画面や設定メニューにも共通化しておくと便利でした。
プレイモード終了イベントを使う:開発中の便利トリック
開発中、「シーンの特定状態になったら自動で停止したい」こともあります。
例えば、ゲームオーバー時にプレイモードを止めたいとか。
その場合、EditorApplication.isPlayingを直接制御できます。
ただしこのAPIはUnityEditor名前空間にあるので、ビルド後には使えません。
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
public class StopOnGameOver : MonoBehaviour
{
public bool isGameOver;
void Update()
{
if (isGameOver)
{
#if UNITY_EDITOR
EditorApplication.isPlaying = false;
#endif
}
}
}
このスクリプトを使うと、テストプレイ中に自動で再生が止まります。
たとえばAI挙動のチェック中や、ステージのデバッグにも便利です。
「エディタだけで止まる」挙動なので、本番アプリには影響しません。
ゲーム終了と「ゲームオーバー」は別物
初心者の方が混同しやすいのが、「ゲーム終了」と「ゲームオーバー」の違いです。
ゲームオーバーは「プレイヤーが負けた状態」ですが、アプリとしてはまだ動いています。
画面を停止したりリトライメニューを出したりする処理は、実際には「ゲームの一時停止」に近いです。
終了処理(Application.Quit())はアプリそのものを閉じる命令なので、リトライや再開はできません。
そのため、両方を混ぜずにスクリプトを分けておくのが安全です。
強制終了が起きるときの原因と対策
たまに「ゲームが急に落ちた」「ボタンを押したら止まった」という現象が起こります。
わたしが遭遇したケースでは、終了処理の呼び出し順やUIのイベント設定ミスが原因でした。
よくある原因としては:
-
Application.Quit()を誤ってUpdate内で常時呼んでいる - 複数のUIボタンが同じQuit関数を重複呼び出ししている
- 確認パネルを閉じる前にQuitを実行してしまう
- WebGLやiOSで終了処理が無視されているのを「バグ」と勘違いしている
特にWebGLはブラウザ制御の都合でApplication.Quit()が効きません。
その場合は「メニューに戻る」「タイトルに戻る」などの遷移に置き換えるのが現実的です。
実際、わたしも最初は「終了しないバグ」と思っていましたが、仕様でした。
エラーではなく「サポート外」です。
まとめ:終了処理も「体験の一部」
Unityのゲーム終了処理は、シンプルに見えて意外と奥が深いです。
ただ閉じるだけではなく、「どう見せるか」「どう確認させるか」もユーザー体験の一部です。
シンプルにまとめると:
- ビルド後の終了:
Application.Quit() - エディタ内で止める:
UnityEditor.EditorApplication.isPlaying = false - UIボタンで終了:OnClickイベントに関数を登録
- 確認ダイアログで誤操作防止
- WebGLやiOSでは終了ではなく「画面遷移」対応
わたし自身、初めて作ったUnityゲームで「終了ボタンが効かない…」と焦った経験があります。
でも一度理解すれば、どんな環境でも応用できるようになります。
もしUI設計や終了画面のデザインも学びたい方は、
Unity入門の森ショップにあるUI講座をのぞいてみるのもおすすめです。
終了処理を“気持ちよく終われる演出”にするのも、ゲームデザインの楽しさのひとつです。