How do I Quit a game in Unity?

Cómo Salir de un Juego en Unity: Guía Completa

28/07/2015

Valoración: 4.81 (10229 votos)

Casi cualquier juego o aplicación que desarrolles necesitará, en algún momento, una forma de cerrarse. En Unity, esta tarea es aparentemente sencilla, pero esconde varios matices importantes que todo desarrollador debe conocer. La forma de salir de un juego no es la misma en una versión compilada (un build) que cuando estás probando en el editor. Además, cada plataforma, como PC, Android o iOS, tiene sus propias convenciones.

How to exit out of play mode in Unity?
However, it is still possible to exit out of Play Mode from a script in Unity, you just need to use a different function to do it. This works by setting the Is Playing property of the Editor Application class to false. Like this: This has the same effect as quitting the game using Application Quit, except that it works in the editor.

No te preocupes, en este artículo desglosaremos todo lo que necesitas saber para implementar una función de salida robusta y profesional en tus proyectos de Unity. Veremos desde el método básico hasta cómo ejecutar código justo antes de que el juego se cierre, cómo manejar diferentes plataformas y qué hacer si el editor se congela. ¡Empecemos por lo fundamental!

Índice de Contenido

El método básico para salir: Application.Quit()

La forma más directa de cerrar una aplicación en Unity es utilizando la función Application.Quit(). Esta función, cuando es llamada, le indica al sistema operativo que la aplicación debe cerrarse.

Su uso es increíblemente simple. En cualquier parte de tu código donde quieras iniciar el cierre del juego, simplemente escribe:

Application.Quit();

Sin embargo, hay una advertencia crucial: Application.Quit solo funciona en las versiones compiladas de tu juego (por ejemplo, un .exe en Windows, un .app en macOS o un .apk en Android). Cuando ejecutas tu juego dentro del Unity Editor en Modo Juego (Play Mode), esta llamada es completamente ignorada. Esto es intencional, para evitar que cierres accidentalmente el editor mientras trabajas. Más adelante veremos cómo solucionar esto.

Implementando la salida con una tecla

Una práctica común es permitir que el jugador salga del juego presionando la tecla 'Escape'. Esto se puede lograr fácilmente verificando la entrada del teclado en el método Update() de un script.

Crea un script, llámalo por ejemplo `QuitManager`, y añade el siguiente código:

using UnityEngine; public class QuitManager: MonoBehaviour { void Update() { // Comprueba si el usuario ha presionado la tecla Escape if (Input.GetKeyDown(KeyCode.Escape)) { Debug.Log("Saliendo del juego..."); Application.Quit(); } } }

Arrastra este script a un objeto vacío en tu escena (como un 'GameManager'). Ahora, cuando ejecutes el juego compilado y presiones 'Escape', la aplicación se cerrará.

Conectando la función de salida a un botón de UI

La mayoría de los juegos tienen un botón de "Salir" en su menú principal o de pausa. Para conectar la función Application.Quit() a un botón de la interfaz de usuario (UI), primero debemos encapsularla en una función pública.

Modifica tu script `QuitManager` de la siguiente manera:

using UnityEngine; public class QuitManager: MonoBehaviour { // Esta función debe ser pública para ser accesible desde el Inspector de Unity public void SalirDelJuego() { Debug.Log("El jugador ha hecho clic en el botón de salir."); Application.Quit(); } }

Ahora, sigue estos pasos en el editor de Unity:

  1. Selecciona el componente `Button` en tu Canvas.
  2. En el Inspector, busca la sección "On Click ()".
  3. Haz clic en el botón '+' para añadir un nuevo evento.
  4. Arrastra el objeto de la escena que contiene tu script `QuitManager` al campo que dice "None (Object)".
  5. Haz clic en el menú desplegable (que probablemente dice "No Function") y navega hasta el nombre de tu script (`QuitManager`) y selecciona la función `SalirDelJuego()`.

¡Listo! Ahora, al hacer clic en ese botón en tu juego compilado, se llamará a la función y el juego se cerrará. Pero, ¿qué pasa con el editor?

Saliendo del Modo Juego desde un script en el Editor

Como mencionamos, Application.Quit() no funciona en el editor. Para salir del Modo Juego mediante un script mientras desarrollas, necesitas usar una clase específica del editor: UnityEditor.EditorApplication.

How do I Quit a game in Unity?
You can quit a game in Unity by calling the Application.Quit function, which will close a running application. However, while this works to end a built application, Application Quit is ignored when running the game in Play Mode in the editor. Find the answer to your question by asking. See similar questions with these tags.

El código para detener el Modo Juego es:

UnityEditor.EditorApplication.isPlaying = false;

Esto hace exactamente lo mismo que presionar el botón de Play en la barra de herramientas del editor para detener la ejecución. Es muy útil para probar la lógica de salida sin tener que compilar el juego cada vez.

El problema es que el namespace UnityEditor no puede ser incluido en una compilación final del juego. Si intentas compilar tu proyecto con una línea de código que lo use, recibirás un error que detendrá el proceso. Aquí es donde entran en juego las directivas de preprocesador.

La solución unificada: Directivas de Preprocesador

Las directivas de preprocesador son instrucciones especiales que le dicen al compilador que incluya o excluya ciertas partes del código según las condiciones definidas. Para nuestro caso, usaremos #if UNITY_EDITOR para asegurarnos de que el código de salida del editor solo se compile cuando estemos dentro de Unity, y se ignore al crear un build.

Aquí está la versión final y robusta de nuestra función `SalirDelJuego()`:

using UnityEngine; // Es necesario incluir este namespace para acceder a EditorApplication #if UNITY_EDITOR using UnityEditor; #endif public class QuitManager: MonoBehaviour { public void SalirDelJuego() { Debug.Log("Se ha solicitado salir del juego."); // Si estamos en el editor de Unity #if UNITY_EDITOR // Detenemos la ejecución del Modo Juego EditorApplication.isPlaying = false; #else // Si estamos en una versión compilada, cerramos la aplicación Application.Quit(); #endif } }

Esta función es la solución definitiva. Si la llamas desde el editor, detendrá el Modo Juego. Si la llamas desde un juego compilado, cerrará la aplicación. Es la forma correcta y profesional de manejar la salida de tu juego.

Ejecutando código justo antes de cerrar: OnApplicationQuit()

A veces, necesitas realizar acciones de último minuto antes de que el juego se cierre por completo. Por ejemplo, guardar el progreso del jugador, enviar datos de análisis o liberar recursos. Unity nos proporciona un método especial para esto: OnApplicationQuit().

Este es un método de mensaje de MonoBehaviour, similar a `Start()` o `Update()`. Se llama automáticamente en todos los GameObjects activos justo antes de que la aplicación se cierre.

void OnApplicationQuit() { Debug.Log("La aplicación está a punto de cerrarse. Guardando datos..."); // Ejemplo: Guardar la puntuación más alta PlayerPrefs.SetInt("HighScore", 1000); PlayerPrefs.Save(); }

Es importante saber que OnApplicationQuit() se llama en salidas controladas (cuando se usa `Application.Quit()` o se cierra la ventana). No se garantiza su ejecución si el juego crashea o es forzado a cerrarse por el sistema operativo.

How do I Quit a game in Unity?

Consideraciones para Plataformas Móviles

iOS

En el ecosistema de Apple, las directrices de diseño de interfaces humanas desaconsejan explícitamente incluir un botón para salir de la aplicación. Se espera que el usuario gestione las aplicaciones usando los controles del sistema operativo (como deslizar hacia arriba desde la parte inferior de la pantalla). De hecho, si llamas a Application.Quit() en iOS, puede parecer que tu aplicación ha crasheado, lo que podría llevar a un rechazo durante el proceso de revisión de la App Store.

Android

En Android, Application.Quit() funciona como se espera y cierra la aplicación. Sin embargo, los usuarios de Android están acostumbrados a usar el botón físico o virtual de "Atrás" para navegar y cerrar aplicaciones. Puedes detectar la pulsación de este botón, ya que Unity lo mapea a KeyCode.Escape.

Puedes usar el código que vimos para la tecla Escape para manejar el botón de atrás y, por ejemplo, mostrar un menú de pausa o un diálogo de confirmación ("¿Seguro que quieres salir?") en lugar de cerrar el juego abruptamente.

Tabla Comparativa: Métodos para Salir

MétodoFunciona en BuildFunciona en EditorUso Recomendado
Application.Quit()No (es ignorado)Para la lógica de cierre en la versión final del juego.
UnityEditor.EditorApplication.isPlaying = falseNo (causa error de compilación)Solo para pruebas y herramientas de editor.
Método combinado con #if UNITY_EDITORLa mejor práctica. Crea una única función que funciona en ambos entornos.

Preguntas Frecuentes (FAQ)

¿Por qué mi botón de salir no funciona en el editor de Unity?

Probablemente estás usando Application.Quit() directamente, que es ignorado en el editor. Debes usar la solución combinada con las directivas de preprocesador (`#if UNITY_EDITOR`) para que también detenga el Modo Juego en el editor.

¿Puedo mostrar un mensaje de confirmación antes de salir?

¡Claro! En lugar de que tu botón llame directamente a la función `SalirDelJuego()`, haz que active un panel de UI con el mensaje "¿Estás seguro?" y dos botones: "Sí" y "No". El botón "Sí" llamará a la función `SalirDelJuego()`, mientras que el botón "No" simplemente ocultará el panel de confirmación.

¿Qué pasa si Unity se congela en Modo Juego?

A veces, un bucle infinito u otro error puede congelar el editor en Modo Juego. Si esto sucede y no has guardado tu escena, ¡no todo está perdido! Antes de entrar en Modo Juego, Unity guarda automáticamente una copia de seguridad de tu escena en la carpeta `Temp` de tu proyecto. Busca una carpeta llamada `__Backupscenes` y dentro encontrarás un archivo como `0.backup`. Copia este archivo a tu carpeta de `Assets` y cámbiale la extensión a `.unity`. Podrás abrirlo y recuperar tu trabajo. ¡Actúa rápido, porque la carpeta `Temp` se borra al reiniciar Unity!

¿`OnApplicationQuit()` se ejecuta siempre?

No. Está diseñado para salidas "limpias". Si la aplicación crashea, se queda sin memoria o el usuario la fuerza a cerrarse desde el administrador de tareas, es muy probable que `OnApplicationQuit()` no llegue a ejecutarse. Por ello, es bueno tener un sistema de guardado automático periódico además de guardar al salir.

Si quieres conocer otros artículos parecidos a Cómo Salir de un Juego en Unity: Guía Completa puedes visitar la categoría Juegos.

Subir