【Unity】アプリケーションを終了させる方法
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回
ディスカッション
コメント一覧
まだ、コメントがありません