【Unity】アプリケーションを終了させる方法

2025年10月21日

Uniyエディターで実行している時と、ビルドされたアプリをPCで実行している時の終了方法は異なります

アプリを終了したい時のコード

終了処理時に次のスクリプトを実行させます

#if UNITY_EDITOR
    EditorApplication.isPlaying = false;
#elif UNITY_STANDALONE
    Application.Quit();
#endif

このコードは、Unityの環境下で実行された場合に、アプリケーションの実行を終了させるためのものです。

Unity Editor内でプレビュー実行された場合には、EditorApplication.isPlayingプロパティをfalseに設定してアプリケーションの実行を停止します。

一方、実際にビルドして実行された場合には、Application.Quitメソッドを呼び出してアプリケーションの実行を終了します。

#ifディレクティブは、コンパイル時に指定されたシンボルが定義されている場合に、そのコードブロックをコンパイルすることを示します。この場合、UNITY_EDITORとUNITY_STANDALONEが指定されているため、それぞれの環境下でコンパイルされるコードが切り替わります。UNITY_EDITORはUnity Editor内でのプレビュー実行時に定義され、UNITY_STANDALONEはビルドした環境での実行時に定義されます。

using UnityEngine;

public class Exit : MonoBehaviour
{
    // Escapeキーの押下でゲームを終了する
    // Updateメソッドは毎フレーム呼ばれるので、Updateメソッド内でキー入力を監視する
    [SerializeField]
    private KeyCode exitKey = KeyCode.Escape; // ゲーム終了キー
                                              // ゲーム終了キーを押したら、アプリケーションを終了する
    private void Update()
    {
        if (Input.GetKeyDown(exitKey))
        {
            // エディタ上で実行している場合は、エディタを終了する
#if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
#elif UNITY_STANDALONE
               // スタンドアロンビルドの場合は、アプリケーションを終了する
               Application.Quit();
#endif
        }
    }
}
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif

/// <summary>
/// Escapeキー(または指定アクション)でアプリを終了する。
/// - Input System が有効なら InputAction を使う
/// - 無効時は従来の Input.GetKeyDown でフォールバック
/// - モバイル(iOS/Android)では終了処理を行わない(OS任せ)
[DisallowMultipleComponent]
public sealed class Exit : MonoBehaviour
{
    [SerializeField]
    private bool quitInEditor = true; // Editor再生停止を有効にするか

#if ENABLE_INPUT_SYSTEM
    [Header("Input System")]
    [Tooltip("未設定なら Escape / Gamepad Start/Select / XR Menu を実行時に自動バインド")]
    [SerializeField] private InputActionReference exitActionRef;

    private InputAction _exitAction;

    private void OnEnable()
    {
        // 参照があればそれを使う
        if (exitActionRef != null && exitActionRef.action != null)
        {
            _exitAction = exitActionRef.action;
        }
        else
        {
            // なければ実行時にアクションを生成
            _exitAction = new InputAction("Exit", InputActionType.Button, "<Keyboard>/escape");
            _exitAction.AddBinding("<Gamepad>/start");
            _exitAction.AddBinding("<Gamepad>/select");
            _exitAction.AddBinding("<XRController>/menu");
        }

        _exitAction.performed += OnExitPerformed;
        if (!_exitAction.enabled) _exitAction.Enable();
    }

    private void OnDisable()
    {
        if (_exitAction != null)
        {
            _exitAction.performed -= OnExitPerformed;

            // 実行時生成のみ Dispose
            if (exitActionRef == null) _exitAction.Dispose();
        }
    }

    private void OnExitPerformed(InputAction.CallbackContext _)
    {
        Quit();
    }
#else
    [Header("Legacy Input (フォールバック)")]
    [SerializeField] private KeyCode exitKey = KeyCode.Escape;

    private void Update()
    {
        if (Input.GetKeyDown(exitKey))
        {
            Quit();
        }
    }
#endif

    private void Quit()
    {
#if UNITY_EDITOR
        if (quitInEditor)
        {
            UnityEditor.EditorApplication.isPlaying = false;
        }
#elif UNITY_STANDALONE
        Application.Quit();
#endif
        // UNITY_ANDROID / UNITY_IOS では処理しない(OS管理に任せる)
    }
}

参考

訪問数 156 回, 今日の訪問数 1回

Unity

Posted by hidepon