Mejora tu código con patrones de programación de juegos

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESSenior Technical Content Marketing Manager
Oct 13, 2022|15 minutos
Mejora tu código con patrones de programación de juegos
Para tu comodidad, tradujimos esta página mediante traducción automática. No podemos garantizar la precisión ni la confiabilidad del contenido traducido. Si tienes alguna duda sobre la precisión del contenido traducido, consulta la versión oficial en inglés de la página web.
Ilustración del patrón de mando
El patrón de comandos

Si tiene experiencia con lenguajes de programación orientados a objetos, es probable que haya oído hablar de los principios SOLID, los patrones MVP, singleton, factory y observer. Nuestro nuevo libro electrónico destaca las mejores prácticas para utilizar estos principios y patrones con el fin de crear una arquitectura de código de juego escalable en tu proyecto Unity.

Por cada problema de diseño de software que te encuentres, mil desarrolladores han pasado por lo mismo antes. Aunque no siempre puedes pedirles consejo directamente, puedes aprender de sus decisiones a través de patrones de diseño.

Al implementar patrones de diseño de programación de juegos comunes en tu proyecto de Unity, puedes crear y mantener de manera eficiente una base de código limpia, organizada y legible, lo que a su vez crea una base sólida para escalar tu juego, equipo de desarrollo y negocio.

Una guía de diseño escrita por programadores, para programadores

En nuestra comunidad, a menudo oímos que puede resultar intimidante aprender a incorporar patrones y principios de diseño, como SOLID y KISS, en el desarrollo diario. Por eso nuestro libro electrónico gratuito, Level up your code with game programming patternsexplica patrones de diseño bien conocidos y comparte ejemplos prácticos para usarlos en tu proyecto Unity.

Escrito por expertos internos y externos de Unity, el libro electrónico es un recurso que puede ayudar a ampliar la caja de herramientas de tu desarrollador y acelerar el éxito de tu proyecto. Siga leyendo para ver un avance de lo que incluye la guía.

Patrones de diseño para resolver los retos del desarrollo de juegos

Los patrones de diseño son soluciones generales a problemas comunes de la ingeniería de software. No se trata de soluciones acabadas que puedas copiar y pegar en tu código, sino de herramientas adicionales que pueden ayudarte a crear aplicaciones más grandes y escalables si se utilizan correctamente.

Al integrar patrones de forma coherente en su proyecto, puede mejorar la legibilidad del código y hacer que su base de código sea más limpia. Los patrones de diseño no sólo reducen la refactorización y el tiempo dedicado a las pruebas, sino que aceleran los procesos de incorporación y desarrollo.

Sin embargo, todo patrón de diseño conlleva ventajas y desventajas, ya sean estructuras adicionales que mantener o más configuración al principio. Tendrás que hacer una evaluación coste-beneficio para determinar si la ventaja justifica el trabajo extra necesario. Por supuesto, esta evaluación variará en función de su proyecto.

Busca la sencillez con KISS

KISS son las siglas de "keep it simple, stupid". El objetivo de este principio es evitar la complejidad innecesaria en un sistema, ya que la sencillez contribuye a aumentar los niveles de aceptación e interacción del usuario.

Tenga en cuenta que "sencillo" no equivale a "fácil". Hacer algo sencillo significa centrarlo. Aunque se puede crear la misma funcionalidad sin los patrones (y a menudo más rápidamente), algo rápido y fácil no se traduce necesariamente en algo sencillo.

Si no está seguro de que un patrón se aplique a su problema concreto, puede esperar hasta que le parezca más natural. No utilices un patrón porque sea nuevo o novedoso para ti. Utilízalo cuando lo necesites.

Con este espíritu se creó el libro electrónico. Mantenga la guía a mano como fuente de inspiración para nuevas formas de organizar su código, no como un estricto conjunto de normas que deba seguir.

Pasemos ahora a algunos de los principios clave del diseño de software.

Los principios SOLID definen
El Reproductor, refactorizado en clases con responsabilidades únicas
El Reproductor, refactorizado en clases con responsabilidades únicas

SOLID es un acrónimo mnemotécnico de cinco fundamentos básicos del diseño de software. Puede pensar en ellas como cinco reglas básicas a tener en cuenta al codificar, para garantizar que los diseños orientados a objetos sigan siendo flexibles y mantenibles.

Los principios SOLID fueron introducidos por primera vez por Robert C. Martin en el documento Design Principles and Design Patterns. Publicado por primera vez en el año 2000, los principios descritos siguen siendo aplicables hoy en día, y a los scripts de C# en Unity:

  • La responsabilidad única establece que cada módulo, clase o función es responsable de una cosa y encapsula sólo esa parte de la lógica.
  • Abierto-cerrado establece que las clases deben estar abiertas a la extensión pero cerradas a la modificación; esto significa estructurar sus clases para crear nuevos comportamientos sin modificar el código original.
  • La sustitución de Liskov establece que las clases derivadas deben ser sustituibles por su clase base cuando se utiliza la herencia.
  • La segregación de interfaces establece que ningún cliente debe ser forzado a depender de métodos que no utiliza. Los clientes sólo deben implantar lo que necesitan.
  • La inversión de dependencias establece que los módulos de alto nivel no deben importar nada directamente de los módulos de bajo nivel. Ambos deben depender de abstracciones.

En el libro electrónico, proporcionamos ejemplos ilustrados de cada principio con explicaciones claras para utilizarlos en Unity. En algunos casos, atenerse a SOLID puede suponer trabajo adicional por adelantado. Puede que tenga que refactorizar parte de su funcionalidad en abstracciones o interfaces, pero a menudo se amortiza con ahorros a largo plazo.

Estos principios han dominado el diseño de software durante casi dos décadas en el ámbito empresarial porque se adaptan muy bien a las grandes aplicaciones a escala. Si no está seguro de cómo utilizarlos, recurra al principio KISS. Mantén la sencillez y no intentes forzar los principios en tus guiones por el mero hecho de hacerlo. Deje que se coloquen orgánicamente en su sitio por necesidad.

Si quieres saber más, echa un vistazo a la presentación de SOLID de Unite Austin 2017, a cargo de Dan Sagmiller, de Productive Edge.

Patrones de diseño para el desarrollo de juegos

¿Cuál es la diferencia entre un principio de diseño y un patrón de diseño? Una forma de responder a esta pregunta es considerar SOLID como un marco para escribir código orientado a objetos o como un enfoque básico para ello. Aunque los patrones de diseño son soluciones o herramientas que se pueden implementar para evitar los problemas cotidianos del software, recuerde que no son recetas estándar, ni algoritmos con pasos específicos para lograr resultados concretos.

Un patrón de diseño puede considerarse como un plano. Es un plan general que deja la construcción en tus manos. Por ejemplo, dos programas pueden seguir el mismo patrón pero incluir código muy diferente.

Cuando los desarrolladores se encuentran con el mismo problema en la naturaleza, muchos de ellos llegarán inevitablemente a soluciones similares. Una vez que una solución se repite suficientes veces, alguien puede "descubrir" un patrón y darle formalmente un nombre.

La banda de los cuatro

Muchos de los patrones de diseño de software actuales tienen su origen en la obra seminal Design Patterns: Elements of Reusable Object-Oriented Software por Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides. Este libro analiza 23 de estos patrones identificados en diversas aplicaciones cotidianas.

A menudo se hace referencia a los autores originales como la "Banda de los Cuatro" (GoF), y también oirás los patrones originales apodados los patrones GoF. Aunque los ejemplos citados son en su mayoría en C++ (y Smalltalk), puede aplicar sus ideas a cualquier lenguaje orientado a objetos, como C#.

Desde que la Banda de los Cuatro publicó por primera vez Design Patterns en 1994, los desarrolladores han establecido docenas de patrones orientados a objetos en diversos campos, incluido el desarrollo de juegos.

Aprender patrones de diseño
Ilustración del patrón de diseño de fábrica
El patrón de diseño de fábrica
Una ilustración del patrón singleton.
El patrón singleton

Aunque puedes trabajar como programador de juegos sin estudiar patrones de diseño, aprenderlos te ayudará a convertirte en un mejor desarrollador. Al fin y al cabo, los patrones de diseño se denominan así porque son soluciones comunes a problemas bien conocidos.

Los ingenieros de software los redescubren todo el tiempo en el curso normal del desarrollo. Es posible que ya haya puesto en práctica algunos de estos patrones sin darse cuenta.

Entrénate para buscarlos. Hacer esto puede ayudarte:

  • Aprenda programación orientada a objetos: Los patrones de diseño no son secretos enterrados en un esotérico post de StackOverflow. Son formas habituales de superar los obstáculos cotidianos en el desarrollo. Pueden informarle de cuántos otros desarrolladores han abordado el mismo problema: recuerde que, aunque usted no esté utilizando patrones, alguien más lo está haciendo.
  • Hable con otros desarrolladores: Los patrones pueden servir de taquigrafía a la hora de comunicarse en equipo. Mencione el "patrón de comandos" o el "conjunto de objetos" y los desarrolladores experimentados de Unity sabrán lo que está intentando implementar.
  • Explora nuevos frameworks:Cuando importas un paquete integrado o algo de la Tienda de Activos, inevitablemente te toparás con uno o más patrones de los que se discuten aquí. Reconocer los patrones de diseño le ayudará a entender cómo funciona un nuevo marco de trabajo, así como el proceso de pensamiento implicado en su creación.

Como se ha indicado anteriormente, no todos los patrones de diseño se aplican a todas las aplicaciones de juegos. No vayas a buscarlos con el martillo de Maslow; de lo contrario, puede que sólo encuentres clavos.

Como cualquier otra herramienta, la utilidad de un patrón de diseño depende del contexto. Cada uno aporta una ventaja en determinadas situaciones y también tiene sus inconvenientes. Cada decisión en el desarrollo de software conlleva compromisos.

¿Generas muchos GameObjects sobre la marcha? ¿Influye en su rendimiento? ¿Se puede solucionar reestructurando el código? Ten en cuenta estos patrones de diseño y, cuando llegue el momento, sácalos de tu bolsa de trucos de gamedev para resolver el problema en cuestión.

Además de los patrones de diseño de la Banda de los Cuatro , Game Programming Patterns, de Robert Nystrom, es otro recurso destacado, disponible actualmente de forma gratuita en edición web. El autor detalla una variedad de patrones de software de una manera sencilla.

En nuestro nuevo libro electrónico, puedes sumergirte en las secciones que explican los patrones de diseño más comunes, como los patrones de fábrica, reserva de objetos, singleton, comando, estado y observador, además del Modelo Vista Presentador (MVP), entre otros. Cada sección explica el patrón junto con sus pros y contras, y proporciona un ejemplo de cómo implementarlo en Unity para que puedas optimizar su uso en tu proyecto.

Patrones dentro de Unity

Unity ya implementa varios patrones establecidos de gamedev, ahorrándote la molestia de escribirlos tú mismo. Entre ellas figuran:

  • Bucle de juego: En el núcleo de todos los juegos hay un bucle infinito que debe funcionar independientemente de la velocidad del reloj, ya que el hardware que alimenta una aplicación de juego puede variar enormemente. Para tener en cuenta las distintas velocidades de los ordenadores, los desarrolladores de juegos suelen tener que utilizar un paso de tiempo fijo (con un número determinado de fotogramas por segundo) y un paso de tiempo variable en el que el motor mide el tiempo transcurrido desde el fotograma anterior.

    Unity se encarga de esto, así que no tienes que implementarlo tú mismo. Sólo tienes que gestionar el juego utilizando métodos MonoBehaviour como Update, LateUpdate y FixedUpdate.
  • Actualización: En tu aplicación de juego, a menudo actualizarás el comportamiento de cada objeto fotograma a fotograma. Mientras que usted puede recrear esto manualmente en Unity, la clase MonoBehaviour hace esto automáticamente. Use los métodos apropiados Update, LateUpdate, o FixedUpdate para modificar sus GameObjects y componentes a un tick del reloj del juego.
  • Prototipo: A menudo es necesario copiar objetos sin afectar al original. Este patrón de creación resuelve el problema de duplicar y clonar un objeto para crear otros objetos similares a él. De esta forma evitarás definir una clase distinta para generar cada tipo de objeto de tu juego.

    El sistema Prefab de Unity implementa una forma de creación de prototipos para GameObjects. Esto le permite duplicar un objeto de plantilla completo con sus componentes. Anule propiedades específicas para crear Variantes de Prefabricados o anide Prefabricados dentro de otros Prefabricados para crear jerarquías. Utilice un modo especial de edición de prefabricados para editar prefabricados de forma aislada o en contexto.
  • Componente:La mayoría de las personas que trabajan en Unity conocen este patrón. En lugar de crear grandes clases con múltiples responsabilidades, construya componentes más pequeños que hagan cada uno una cosa.

    Si utiliza la composición para elegir componentes, puede combinarlos para obtener un comportamiento complejo. Añada componentes Rigidbody y Collider para la física, o un MeshFilter y MeshRenderer para la geometría 3D. Cada GameObject es tan rico y único como su colección de componentes.
Crear una arquitectura de código que se adapte a la imagen promocional del libro electrónico
Crear una arquitectura de código escalable

Tanto el libro electrónico como un proyecto de ejemplo sobre el uso de patrones de diseño están ya disponibles para su descarga gratuita. Revise los ejemplos y decida qué patrón de diseño se adapta mejor a su proyecto. A medida que adquiera experiencia con ellos, reconocerá cómo y cuándo pueden mejorar su proceso de desarrollo. Como siempre, te animamos a que visites el hilo del foro y nos digas qué te parecen el libro electrónico y la muestra.