Cómo comenzar a desarrollar juegos en Unity

En esta guía, se describe un ciclo típico de desarrollo de juegos. Después de leerla, tal vez te resulte útil usarla también como referencia.

Cuando trabajas con Unity, el ciclo de vida de desarrollo consta de tres etapas:

  • Planificación y diseño
  • Desarrollo y pruebas
  • Publicación y mantenimiento

Planificación y diseño

En la etapa de planificación y diseño, determinas cómo crear tu juego. Decides cómo abordar los desafíos de crear juegos para dispositivos móviles e identificas las herramientas y los procesos que usarás en el desarrollo.

Cómo recibir comentarios de todos los miembros del equipo

Trabaja junto con tus equipos de arte, ingeniería, audio y producción para identificar y registrar las tareas de implementación. Por ejemplo:

  • Los equipos de arte pueden crear texturas de recursos y presupuestos de malla para personajes y entornos.
  • El equipo de ingeniería puede determinar los puntos de control de memoria y rendimiento para generar perfiles de cada plataforma y compararlos.
  • El equipo de diseño puede planificar la mecánica del juego que haría posible la experiencia.
  • Los expertos en sonido pueden revisar los requisitos de continuidad entre el audio espacial 2D y 3D, y de la IU.
  • El equipo de producción puede comunicar los requisitos de lanzamiento y mantener el equipo alineado y enfocado en las tareas.

Diseño para dispositivos móviles

En el desarrollo de aplicaciones para plataformas móviles, se deben tener en cuenta factores específicos, como los siguientes:

  • Relaciones de aspecto de pantalla variables
  • Consumo de energía
  • Limitaciones térmicas y del procesador
  • Entrada táctil
  • Desarrollo multiplataforma
  • APIs de gráficos (OpenGL ES o Vulkan)

Si quieres conocer las consideraciones específicas en el diseño para dispositivos móviles, consulta Desarrollo de Android en Unity (de Unity) y la Academia de Google Play.

Desarrollo y pruebas

En la etapa de desarrollo y pruebas, creas el juego y llevas a cabo las pruebas y la preparación previas al lanzamiento. Realizas algunas pruebas internas limitadas en Google Play para asegurarte de cumplir con los requisitos de lanzamiento. Perfeccionas la estrategia de implementación y organizas los recursos en Unity en función de Play Asset Delivery y los sistemas de Addressables de Unity.

En las próximas secciones, se describen las herramientas y las técnicas de Unity diseñadas para ayudarte a desarrollar contenido para Android.

Renderización

La renderización es el proceso de dibujar en la pantalla los recursos 2D y 3D de tu escena de Unity. Si bien el motor de Unity se encarga de la renderización, es importante tener en cuenta algunos factores sobre la plataforma de Android.

Texturas

Determinan si necesitas los tamaños de texturas más grandes en función de los dispositivos de destino. Cuando generes un perfil de la asignación de memoria, revisa el ahorro potencial si cambiaras el tamaño de textura de destino.

Latencia de fotogramas

Para evitar el sobrecalentamiento en los dispositivos Android, intenta que los valores de la latencia de fotogramas no superen el promedio de 21 milisegundos. A veces, por ejemplo, durante la carga o las experiencias cinemáticas breves, la latencia puede exceder ese valor, pero deberías mantenerla por debajo del umbral de 21 milisegundos para la experiencia del juego en sí.

En las plataformas móviles, la VSync forzada limita la velocidad de fotogramas si no se alcanza el valor de destino mínimo. Por ejemplo, en una actualización de pantalla de 60 Hz, si no se alcanzan los 60 FPS, tu juego se limita a 30; si no se alcanzan los 30, se limita a 15.

Muchos dispositivos Android se envían con frecuencias de actualización de pantalla de 60 Hz y 120 Hz. Analiza las ventajas de orientar el juego a latencias de fotogramas mucho menores (objetivo de 10 ms para una actualización de 60 Hz y 5 ms para 120 Hz) sin arriesgarte a una limitación térmica o al agotamiento de la batería para tasas de renderización más altas.

Para configurar una velocidad de fotogramas específica en tu juego en Unity, usa Application.targetFrameRate.

La biblioteca de Frame Pacing de Android te ayuda a renderizar contenido de manera fluida cuando tu aplicación tarda más en presentar el siguiente fotograma de lo que exige la frecuencia de actualización de la pantalla.

Para habilitar la biblioteca, en Project Settings > Player, debajo de Settings for Android, marca la casilla de verificación junto a Optimized Frame Pacing.

Cuadro de diálogo que muestra Project Settings > Player Settings > Optimized Fame Pacing
Figura 1: La opción Optimized Frame Pacing está disponible debajo de Player Settings en Unity 2019.2 y versiones posteriores

API de Vulkan

Vulkan es una API de gráficos 3D multiplataforma de alto rendimiento que tiene una sobrecarga baja en comparación con OpenGL ES. Unity puede usar Vulkan de dos formas distintas.

API de Auto Graphics

Puedes usar la API de Auto Graphics con Vulkan, pero podrían generarse comportamientos distintos según la versión de Unity que tengas instalada. Para seleccionar esta opción, ve a Project Settings > Player > Rendering.

Ten en cuenta las siguientes consideraciones cuando elijas la versión de Unity que usarás:

  • Unity 2021.1 y versiones anteriores no admiten Vulkan con la API de Auto Graphics. Unity intenta usar OpenGL ES 3.2. Si el dispositivo no es compatible con OpenGL ES 3.2, Unity recurrirá a OpenGL ES 3.1, 3.0 o 2.0, en ese orden.
  • Unity 2021.2 y versiones posteriores usan Vulkan primero. Si el dispositivo no es compatible con Vulkan, Unity recurrirá a OpenGL ES 3.2, 3.1, 3.0 o 2.0.
Project Settings > Player Settings > Rendering > Auto Graphics API
Figura 2: Configuración de la API de Auto Graphics

APIs de gráficos manuales

Como alternativa, puedes habilitar Vulkan de forma manual si inhabilitas la API de Auto Graphics. Si usas Unity 2021.1 o una versión anterior, esta es la única manera de utilizar Vulkan.

Si Vulkan está en un lugar más alto que OpenGL ES en esta lista, Unity intentará usar Vulkan primero. Si el dispositivo no es compatible con Vulkan, Unity se ejecutará con OpenGL ES. Consulta Introducción a Vulkan para obtener información detallada de Vulkan en Android, por ejemplo, cómo usar APIs de gráficos modernas y optimizar el rendimiento de tu juego.

Project Settings > Player Settings > Rendering > Graphics APIs
Figura 3: Configuración manual de APIs de gráficos cuando la API de Auto Graphics está inhabilitada (Vulkan es la primera opción y Unity recurre a OpenGL ES 3.0)

Llamadas de dibujo

Todo lo que aparece en pantalla está asociado con una o más llamadas de dibujo. En plataformas móviles debes optimizar y reducir la cantidad de llamadas de dibujo que envías a la unidad de procesamiento gráfico (GPU).

Imagina que las llamadas de dibujo son como automóviles en fila en un semáforo. Luego de que el semáforo se pone verde, una cierta cantidad de autos pueden avanzar antes de que cambia. Cuando el semáforo se pone amarillo, alcanzaste el objetivo ideal de latencia de fotogramas (21 milisegundos); cuando se pone rojo, llegaste al límite de 33 milisegundos. Un valor superior a esos impactará en el siguiente fotograma de renderización, por lo que la latencia de fotogramas será inferior al objetivo de 30 FPS.

Si quieres obtener más información para mejorar el rendimiento de la llamada de dibujo en tu juego, consulta el artículo sobre lotes en el sitio de asistencia de Unity.

Sombras

Las llamadas de dibujo que proyectan sombras pueden ser las más exigentes para la GPU, ya que consumen la mayoría del tiempo de la unidad incluso para los entornos simples. Si quieres reducir el costo de las llamadas de dibujo que proyectan sombras, puedes experimentar con el uso de sombras más definidas en lugar de suaves. Si esto sigue siendo muy costoso para GPU de dispositivos de gama baja, puedes utilizar sombras de BLOB en lugar de definidas.

Textura

El formato de compresión recomendado para texturas RGB y RGBA en Android es ASTC. En Unity, la opción de compresión de textura mínima que deberías usar en Android es ETC2. Puedes recurrir a ETC2 como respaldo de ASTC en la configuración de compilación de Unity.

Encontrarás la lista completa de formatos admitidos según la plataforma en la documentación de Unity, en Manual: Recommended, default, and supported texture formats, by platform (Manual: formatos de textura recomendados, predeterminados y admitidos según la plataforma).

Interfaz de usuario y relaciones de aspecto

Puedes usar el simulador de dispositivos, una herramienta de Unity, para obtener una vista previa de distintas resoluciones de pantalla, orientaciones y relaciones de aspecto del dispositivo en el editor de Unity. Puedes alternar entre las vistas Game y Device Simulator.

Consulta cómo se ve la herramienta en Simulate your Game with Device Simulator in Unity! (Simula tu juego con el simulador de dispositivos en Unity).

Figura 4: El simulador de dispositivos ejecuta Trivial Kart

Puedes encontrar el código fuente de Trivial Kart en el repositorio de games-samples en GitHub.

Puedes verificar rápidamente el diseño y la precisión de los elementos del lienzo de la IU en la vista Device Simulator seleccionando las opciones de dispositivo en el menú desplegable:

Project Settings > Player Settings > Optimized Frame Pacing
Figura 5: El simulador de dispositivos admite el cambio de dispositivos dentro del editor, por lo que puedes detectar problemas de diseño a tiempo
Project Settings > Player Settings > Optimized Fame Pacing
Figura 6: Marca la casilla junto a Enable Pre-release Packages antes de descargar el paquete del simulador de dispositivos

Si quieres conocer más técnicas de optimización de IU para Unity, consulta el instructivo Optimizing Unity UI (Cómo optimizar la IU de Unity).

Física

El motor Nvidia PhysX está integrado en Unity. La configuración predeterminada puede ser costosa en dispositivos móviles, por lo que debes tener en cuenta lo siguiente:

  • Considera la velocidad de fotogramas objetivo y configura el intervalo de tiempo fijo de manera acorde. Los valores predeterminados son 0.02 ms o 50 Hz. Puedes aumentarlo a 0.03 o más para un objetivo de 30 FPS.
  • Considera simplificar los colisionadores de malla y minimizar la matriz de colisión de capas para determinar interacciones entre objetos del juego con tipos específicos de capas.

Si quieres obtener información sobre la configuración de la física y las optimizaciones para dispositivos móviles, lee el libro electrónico Optimize Your Mobile Games de Unity.

Perfil

A menudo, los desarrolladores de apps no le prestan atención a la generación de perfiles hasta que la aplicación llega a un punto de falla crítico. Es una buena idea programar un tiempo dedicado a la generación de perfiles dentro de tu proceso y emplear las siguientes prácticas recomendadas:

  • Identifica los puntos claves durante el desarrollo en los que puedes asignar tiempo para la generación de perfiles, en lugar de incorporarlo en un momento al azar.
  • Guarda resúmenes de perfiles para usarlos con el analizador de perfiles de Unity.
  • Genera un perfil de tu juego en los dispositivos de destino para obtener un panorama preciso de cómo se ejecutaría en la etapa actual de desarrollo.
  • Genera un perfil de diferentes partes del juego.
  • Genera un perfil de cómo los usuarios jugarían tu juego (es decir, no cuando no hay actividad ni mientras el juego está pausado).
  • Genera un perfil en el modo de rendimiento sostenido después de que el juego se haya estado ejecutando durante un tiempo para detectar problemas de limitación que podrías encontrar cuando los dispositivos móviles están calientes.

Puedes usar las siguientes herramientas de generación de perfiles en conjunto o por separado.

  • Generador de perfiles de Unity: Es una herramienta de análisis de rendimiento totalmente integrada que puede ejecutarse a la par de tu código en el editor de Unity y conectarse con tu dispositivo Android independiente que ejecuta compilaciones en modo de desarrollo.

  • Inspector de GPU de Android: Con el Inspector de GPU de Android (AGI), puedes realizar depuraciones a nivel del fotograma. AGI también analiza los servicios del sistema, incluidos la GPU, la CPU, la memoria, la batería y los contadores de GPU.

Si quieres obtener información para generar perfiles de tu juego en Unity, mira el video Introduction to profiling in Unity (Introducción a la generación de perfiles en Unity) o lee la Ultimate guide to profiling Unity games (Guía definitiva para generar perfiles de juegos de Unity) (ambos de Unity).

Administración de la memoria

Los procesos de Android comparten la memoria disponible en el dispositivo de destino. Se recomienda generar un perfil del uso de memoria cuando el dispositivo de prueba de destino tiene amplios recursos de memoria disponibles. Realiza pruebas de memoria en un punto consistente de tu juego para poder comparar de manera adecuada las sesiones y las tendencias de uso de memoria.

Cuando trabajes con secuencias de comandos escritas en C#, ten cuidado con el uso de cadenas, las comparaciones de cadenas y las asignaciones de objetos relacionados con cadenas (como archivos JSON para configuraciones de juegos), ya que pueden generar asignaciones de memoria frecuentes y contribuir con la fragmentación.

Considera usar la clase StringBuilder para secuencias grandes de manipulación de cadenas, en lugar de la concatenación local de cadenas (por ejemplo: "esta" + "es" + "una" + "mala" + "idea" versus las llamadas a la función StringBuilder.Concat()).

Para obtener más información sobre las cadenas, consulta la sección de cadenas y texto en la documentación de Unity.

Evalúa TextAsset y los recursos de texto JSON en comparación con el tipo de ScriptableObject preferencial. ScriptableObjects maneja el almacenamiento de datos entre escenas de manera eficiente y permite modificaciones de tiempo entre el editor y el juego.

Lee un debate sobre el uso de alternativas al control predeterminado de JSON para la optimización para dispositivos móviles en el artículo de Hutch The hidden optimization in network games (La optimización oculta en los juegos en red).

Usa la API de Memory Advice para determinar cómo se ve tu uso de memoria durante el tiempo de ejecución. La API muestra un indicador de luz de freno para los usos de memoria alto, normal y bajo. Puedes suscribirte al indicador para recibir actualizaciones o sondearlo directamente para conocer el estado actual. Cuando recibas una señal roja, considera reducir el grupo de objetos o la caché del juego. Incluye este contexto en la telemetría de tu juego durante las operaciones en vivo y la revisión de las métricas de rendimiento después del lanzamiento.

Para analizar más en detalle la organización de la memoria en dispositivos Android y saber cómo Unity trabaja con ella, mira el video Understanding Android memory usage (from Google I/O '18 (Comprende el uso de memoria de Android (de Google I/O de 2018)). En el video, se explican los tipos de problemas de memoria y cuándo tiene efecto el optimizador de poca memoria.

Recolección de elementos no utilizados

La recolección de elementos no utilizados en un entorno de memoria administrado limpia los fragmentos de memoria sin usar que se pueden reciclar para una aplicación. Sigue las prácticas recomendadas relacionadas para evitar asignaciones innecesarias de recursos de memoria.

Por ejemplo, crea un grupo de objetos del juego en lugar de usar asignaciones a pedido (GameObject.Instantiate). En el caso de los grupos grandes, considera asignar múltiples fotogramas para disminuir el riesgo de que tu juego no responda en dispositivos Android básicos.

Ten en cuenta el siguiente fragmento de código para obtener una corrutina simple que se invoca desde el principio de un MonoBehaviour:

// Option 1: Bad for memory management - causes allocation each iteration
IEnumerator UpdateEnemyTarget() {
  while (enabled) {
    yield return new WaitForSeconds(1.0f);
    // Some intermittent function check
  }
}

// Option 2: Better for memory management - allocation of yield instruction once, reused each iteration
private YieldInstruction waitForSecond = new WaitForSeconds(1.0f);
IEnumerator BetterUpdateEnemyTarget() {
  while (enabled) {
    yield return waitForSecond;
    // Some other intermittent function
  }
}

Puedes editar el archivo de plantilla de MonoBehaviour para quitar las funciones de stub predeterminadas Start() y Update() de modo que no dejes funciones vacías sin querer a medida que desarrollas el contenido.

Si quieres obtener una descripción general sobre el orden de ejecución de los eventos de MonoBehaviour, consulta Order of execution for event functions (Orden de ejecución para las funciones de eventos) en la documentación de Unity. Consulta el curso Memory Management in Unity (Administración de la memoria en Unity) para obtener más información sobre este tema.

Consulta Optimize your mobile game performance: Tips on profiling, memory, and code architecture from Unity's top engineers (Cómo optimizar el rendimiento de tu juego para dispositivos móviles: sugerencias sobre generación de perfiles, memoria y arquitectura del código de los principales ingenieros de Unity) para obtener sugerencias de optimización.

Reducción de Prefab

Los picos de latencia de fotogramas de la CPU se generan casi exclusivamente a causa de la creación de instancias de Prefab durante el juego. Considera preparar los grupos de objetos para proyectiles, enemigos que pueden aparecer y efectos visuales antes de que se entre al juego para reducir o eliminar los picos de la CPU en el inicio. Puedes propagar optimizaciones adicionales por varios "fotogramas de inicialización" durante las secuencias de carga o introducción en tu escena.

Puedes encontrar muchos recursos de reducción de terceros en la Unity Asset Store relacionados con la administración de la reducción de objetos del juego. También puedes crear recursos propios. Consulta Introduction to Object Pooling on Unity Learn (Introducción a la reducción de objetos en Unity Learn).

Asset Delivery

Existen límites de tamaño para tu aplicación cuando se implementa en Google Play por primera vez. Dependiendo del tamaño y la naturaleza de tu juego, es posible que necesites algunos o todos los recursos del juego (modelos de personajes, entornos, elementos de la IU, etc.) para que los jugadores tengan la experiencia que deseas.

Puedes usar el servicio de Play Asset Delivery (PAD) para administrar recursos que necesita el juego en el momento de la instalación o el seguimiento rápido, o a pedido. Los paquetes de recursos de Unity están integrados para admitir PAD, y puedes usar la herramienta para especificar los elementos que se entregan.

Addressables

Configurar recursos dinámicos (como prefabs, texturas y archivos de sonido) durante el tiempo de ejecución ya no es una operación compleja si preparas y revisas el sistema de nombres de los Addressables. Los recursos Addressable desacoplan la forma en que organizas tu contenido de la manera en que lo compilas y cargas. El sistema de Addressables reemplaza las carpetas Resources y los paquetes de recursos para simplificar el modo en que haces referencia a los recursos y los cargas durante el tiempo de ejecución.

Encuentra un ejemplo en el proyecto de demostración con un paquete de Addressables en GitHub. Para obtener detalles sobre el desarrollo de Addressables, consulta el sistema de recursos Addressable en el blog de Unity.

Con el diseño del recurso Addressable, existen ventajas y desventajas a la hora de agrupar muy pocos o demasiados recursos en paquetes comunes. Para obtener más información sobre la administración de contenido con Addressables, consulta Simplify your content management with Addressables (Cómo simplificar la administración de tu contenido con Addressables).

Puedes configurar una demostración independiente y experimentar con los modos de acceso para familiarizarte con el sistema de Addressables. Además, puedes ver el proyecto de código abierto BuildLayout Explorer para Unity 2019.3 y versiones posteriores e inspeccionar el informe buildlayout.txt generado por Addressables.

Los recursos de Chop Chop, un proyecto abierto de Unity, se empaquetaron usando el sistema de Addressables para toda la carga y la descarga. Consulta Packaging content with Addressable Assets | Open Projects Devlog (Cómo empaquetar contenido con recursos Addressable | Devblog de Open Projects) para ver una explicación de la estructura y la configuración de los paquetes Addressables.

En el proyecto Chop Chop, la escena de inicialización, la única que se carga de manera predeterminada, se configuró para usar AssetReferences en lugar de vínculos directos a recursos en el proyecto (escenas, prefabs, etc.).

El código fuente del proyecto abierto de Unity: Chop Chop está disponible en GitHub. Aunque el proyecto ya no está en desarrollo, aún es posible acceder al repo y a la documentación de Git.

Complementos de terceros

Si usas complementos de terceros, como los que se encuentran en la tienda de recursos de Unity, asegúrate de revisar las carpetas y quitar los recursos innecesarios de las carpetas Resources. Durante el proceso de compilación, Unity recopila todos los recursos incluidos en las carpetas Resources y los agrupa en un solo paquete al que se puede acceder en el tiempo de ejecución. Esto puede sobrecargar el paquete final y, a menudo, no es necesario.

Para encontrar rápidamente todas las carpetas de recursos, busca Resources en el panel Project. Allí, podrás seleccionar una por una para identificar su contenido y decidir si es necesaria para tu juego.

Figura 7: Es posible que haya varias carpetas Resources en las carpetas descargadas desde la tienda de recursos de Unity. Bórralas para evitar que se incluyan en tu paquete de aplicación.

Publicación y mantenimiento

Cuando tengas todo listo para lanzar tu juego para dispositivos móviles, decide para quién deseas lanzarlo, cómo realizar las pruebas alfa y beta, y cómo supervisar y seguir el rendimiento después del lanzamiento.

Cómo analizar comentarios de una versión limitada

Puedes hacer el lanzamiento para un público objetivo limitado y realizar pruebas beta a mayor escala, o activar tu juego para que esté completamente disponible en todos los mercados. Con un lanzamiento limitado, puedes ajustar el rendimiento de tu aplicación en función de un público actual más amplio y una colección de dispositivos.

Por ejemplo, puedes usar Android Performance Tuner para Unity y Google Analytics para Unity, y obtener estadísticas sobre el rendimiento de tu aplicación y tendencias de los jugadores que, a su vez, el equipo de desarrollo puede usar para ajustar y enviar actualizaciones. También puedes utilizar tus datos estadísticos para planificar secuelas o juegos relacionados de un género similar.

Prueba alfa y beta

Después de configurar el perfil de tu aplicación en Google Play Console, puedes preparar compilaciones de prueba alfa y beta públicas, y distribuirlas a un público limitado para obtener una revisión previa al lanzamiento. Si realizas el lanzamiento para un público limitado, puedes resolver los problemas finales con un grupo de dispositivos más grande y reunir comentarios iniciales que puedes responder antes del lanzamiento global.

Tus compilaciones de Unity se distribuyen por los Android App Bundles. Consulta el artículo Manual: Delivering to Google Play (Manual: Entrega a Google Play) de Unity, en el que también se describen los cambios de los archivos APK al formato AAB.

Supervisión y seguimiento

Durante la etapa de operaciones en vivo y distribución de tu juego, puedes usar Android vitals para hacer un seguimiento de los problemas de rendimiento en los dispositivos a los que tal vez no pudiste acceder durante el desarrollo y las pruebas. Para obtener más detalles, mira What's new for games in Reach and devices and Android vitals (Novedades sobre juegos en Alcance y dispositivos y Android vitals).

A menudo, los equipos de desarrollo más grandes tienen canales de telemetría de juegos únicos y personalizados que proporcionan métricas relacionadas con el rendimiento del dispositivo. Recuerda aprovechar Android Performance Tuner (APT) y el complemento de Unity correspondiente para conectar las métricas relacionadas con las velocidades de fotogramas, el realismo de los gráficos, el tiempo de carga y el abandono de la carga. Sigue la guía paso a paso en Cómo integrar Android Performance Tuner en tu juego de Unity.

El ciclo de vida de tu juego no se detiene después de que lo publicas. La supervisión, el mantenimiento y las respuestas relacionados con el rendimiento y los comentarios son fundamentales para que los usuarios estén conformes, brinden opiniones positivas y, en definitiva, adopten tu juego en todos los mercados.