Unity es una gran herramienta para crear prototipos de todo, desde juegos hasta visualizaciones interactivas. En este artículo, analizamos todo lo que necesita saber para comenzar a usar Unity.
Primero, un poco sobre mí: soy un desarrollador de unidad aficionado, modelador 3D y diseñador gráfico que ha trabajado con Unity y Blender durante más de 5 años. Ahora soy estudiante de matemáticas financieras en el University College de Dublín y, ocasionalmente, hago diseño gráfico, creación de prototipos web y creación de prototipos de juegos por cuenta propia.

Introducción
Este artículo está dirigido a cualquiera que nunca haya usado Unity antes, pero que tenga experiencia previa en programación o en diseño / desarrollo web. Al final de este artículo, deberías tener una buena descripción general del motor, así como todas las funciones y el código necesarios para comenzar a hacer un juego básico.
¿Por qué Unity?
Si quieres hacer juegos
Realmente hay muy pocas opciones cuando se trata del desarrollo de juegos independientes. Las tres opciones principales si quieres crear juegos son Unreal, Unity o GameMaker.
Unity es probablemente la menos obstinada de las 3 plataformas. Te brinda un producto muy crudo listo para usar, pero es altamente flexible, bien documentado y altamente extensible para construir casi cualquier género de juego que puedas imaginar.
Hay muchos juegos de gran éxito como Escape from Tarkov (FPS), Monument Valley (Puzzler) y This War of Mine (Estrategia / Supervivencia), todos construidos en Unity.
En realidad, el motor en el que construyes tu primer juego probablemente no sea crítico, así que mi consejo es que elijas uno y lo sigas.
Si quieres crear prototipos de experiencias de usuario
Dado que la unidad es solo un motor con un montón de física, animación y renderizado 3D en tiempo real, también es un gran espacio para hacer prototipos interactivos completos para estudios de UX.
Unity tiene soporte completo para VR y AR y, por lo tanto, podría ser una gran herramienta para explorar arquitectura, automatizaciones y simulaciones con clientes.
Secciones de este artículo
- ¿Por qué Unity?
- Ventana del editor de Unity
- Objetos de juego de Unity
- Componentes integrados de Unity
- Crear componentes personalizados
- Estructura de un monocomportamiento
- Manipular GameObjects
- Raycasting
- Detección de colisiones
- Características avanzadas
- Consejos para los recién llegados
- Recursos y comunidades agradables
- Conclusión
Ventana del editor de Unity
La ventana del editor está dividida en un par de secciones. Cubriremos esto muy brevemente, ya que nos referiremos a él constantemente a lo largo del artículo. Si ya estás familiarizado con esto, ¡pasa!

¡Ahora estamos bien para empezar!
Objetos de juego de Unity
¿Qué son los GameObjects?
Los GameObjects son el componente básico de todo en el motor de juegos de Unity. El nombre casi lo delata:
Todo lo que coloques dentro de una escena en Unity debe estar envuelto en un 'objeto de juego'.Si tienes experiencia en diseño web, ¡puedes pensar en GameObjects como elementos muy parecidos! Contenedores extremadamente aburridos, pero altamente extensibles para crear funciones o elementos visuales complejos.

Literalmente, todo, desde efectos de partículas, cámaras, jugadores, elementos de la interfaz de usuario,… (la lista continúa) es un GameObject.
Crear jerarquía
Como en el desarrollo web, un GameObject también es un contenedor. Así como anida s para crear diseños o abstracciones variados y deseables, es posible que desee hacer lo mismo con los objetos de los juegos.
La lógica detrás de anidar los objetos del juego es muy parecida a la del desarrollo web, daré algunos ejemplos ...Desorden y eficiencia
Analogía web: tiene muchos elementos similares que pueden generarse dinámicamente sobre la marcha en respuesta a la interacción del usuario y desea mantenerlos ordenados. Traducción de la unidad: si está construyendo un clon de Minecraft y tiene muchos bloques en la escena, debe agregar y eliminar 'trozos' de bloques de la escena por razones de rendimiento. Por lo tanto, tenerlos vinculados a un GameObject vacío para cada fragmento tiene sentido, ya que eliminar el fragmento principal elimina todos los bloques secundarios.Posicionamiento
Analogía web: desea mantener la posición del contenido incluido "en relación" con el contenedor y no con la página web. Traducción de unidad: has creado un montón de drones de ayuda que se ciernen alrededor del jugador. Realmente no preferiría escribir código para decirles que persigan al jugador, por lo que en su lugar los instancia como hijos del objeto de juego del jugador.Componentes integrados de Unity
El modelo de componentes de actor
Los GameObjects por sí solos son bastante inútiles, como hemos visto, son básicamente contenedores. Para agregarles funcionalidad, tenemos que agregar componentes, que son esencialmente scripts escritos en C # o Javascript.
Unity funciona a partir de un modelo de componente de actor, en pocas palabras, los GameObjects son los actores y los componentes son tus scripts.
Si ha escrito alguna aplicación web antes, estará familiarizado con la idea de crear pequeños componentes reutilizables, como botones, elementos de formulario, diseños flexibles que tienen varias directivas diferentes y propiedades personalizables. Luego, ensamblar estos pequeños componentes en páginas web más grandes.
La gran ventaja de este enfoque es el nivel de reutilización y los canales de comunicación claramente definidos entre los elementos. Asimismo, en el desarrollo de juegos, queremos minimizar el riesgo de efectos secundarios no deseados. Los pequeños errores tienden a salirse de control si no se tiene cuidado y son extremadamente difíciles de depurar. Por lo tanto, la creación de componentes pequeños, robustos y reutilizables es fundamental.
Componentes clave integrados
Creo que es hora de algunos ejemplos de los componentes integrados proporcionados por el motor de Unity Games.
- MeshFilter: le permite asignar materiales a una malla 3D a un GameObject
- MeshRender: le permite asignar materiales a una malla 3D
- [Cuadro | Mesh] Collider: permite la detección de GameObject durante colisiones
- Rigidbody: permite una simulación física realista para actuar en GameObjects con mallas 3d y activará eventos de detección en los colisionadores de cajas
- Luz: ilumina partes de su escena
- Cámara: define la ventana del jugador que se adjuntará a un GameObject
- Varios componentes de UI Canvas para mostrar GUI
Hay muchos más, pero estos son los principales con los que deberá familiarizarse. Un consejo es que puede acceder a todos los documentos para estos a través del manual de la unidad y la referencia de secuencias de comandos sin conexión dondequiera que se encuentre:

Crear componentes personalizados
Los componentes incorporados controlan la física y las imágenes principalmente, pero para crear realmente un juego, necesitarás aceptar la entrada del usuario y manipular esos componentes estándar, así como los propios GameObjects.
Para comenzar a crear componentes, vaya al GameObject deseado> Agregar componente> escriba el nombre de su nuevo componente en la barra de búsqueda> nuevo script (c #).Como recomendación general, desaconsejaría el uso de Javascript en Unity. No se ha mantenido actualizado con todas las excelentes cosas que vinieron con ES6, y la mayoría de las cosas más avanzadas se basan en C # transferidas a Javascript ... Simplemente se convierte en una solución alternativa gigante en mi experiencia.
Estructura de un monocomportamiento
Funciones clave
Todos los componentes heredan de la clase MonoBehaviour. Incluye varios métodos estándar, lo más importante:
- void Start () que se llama cada vez que se crea una instancia de un objeto que contiene el script en la escena. Esto es útil cada vez que queremos realizar algún código de inicialización, por ejemplo. configurar el equipo de un jugador después de que aparezcan en una partida.
- void Update () que se llama cada fotograma. Aquí es donde irá la mayor parte del código que involucra la entrada del usuario, actualizando varias propiedades, como el movimiento del jugador en la escena.
Variables del inspector
A menudo, queremos que los componentes sean lo más flexibles posible. Por ejemplo, todas las armas pueden tener diferentes daños, cadencia de disparo, has_sight, etc. Si bien todas las armas son esencialmente lo mismo, es posible que deseemos poder crear diferentes variaciones rápidamente a través del editor de unidad.
Otro ejemplo en el que podríamos querer hacer esto es al crear un componente de interfaz de usuario que rastrea los movimientos del mouse del usuario y coloca un cursor en la ventana gráfica. Aquí es posible que deseemos controlar la sensibilidad del cursor a los movimientos (si el usuario estaba usando un joystick o gamepad en lugar de un mouse de computadora). Por lo tanto, tendría sentido tener estas variables fáciles de cambiar tanto en el modo de edición como también experimentar con ellas durante el tiempo de ejecución.

Podemos hacer esto fácilmente simplemente declarándolos como variables públicas en el cuerpo del componente.

Aceptar la entrada del usuario
Por supuesto, queremos que nuestro juego responda a la entrada del usuario. Las formas más comunes de hacerlo son utilizando los siguientes métodos en la función Update () de un componente (o en cualquier otro lugar que desee):
- Input.GetKey (KeyCode.W) Devuelve True La tecla W se mantiene presionada
- Input.GetKeyDown (KeyCode.W) Devuelve True cuando se presiona la tecla W por primera vez
- Input.GetAxis (“Vertical”), Input.GetAxis (“Horizontal”) Devuelve entre -1,1 movimiento de entrada del mouse
Manipular GameObjects
Una vez que tengamos la entrada del usuario, queremos que GameObjects dentro de nuestra escena responda. Hay varios tipos de respuestas que podemos considerar:
- Traducción, rotación, escala
- Crear nuevos GameObjects
- Envío de mensajes a GameObjects / componentes existentes
Transformaciones
Todos los GameObjects tienen una propiedad de transformación que permite realizar varias manipulaciones útiles en el objeto del juego actual.

Los métodos anteriores se explican por sí mismos, solo tenga en cuenta que usamos gameObject en minúsculas para referirnos al GameObject que posee esta instancia específica del componente.
En general, es una buena práctica usar local [Posición, Rotación] en lugar de la posición / rotación global de un objeto. Esto generalmente hace que sea más fácil mover objetos de una manera que tenga sentido, ya que el eje del espacio local estará orientado y centrado en el objeto principal en lugar del origen del mundo y las direcciones x, y, z.

Si necesita convertir entre espacio local y mundial (que suele ser el caso), puede utilizar lo siguiente:

Como puede imaginar, hay algo de álgebra lineal bastante simple detrás de esto, insinuado por el 'Inverso' en el nombre del método.
Creando nuevos GameObjects
Dado que los GameObjects son básicamente todo en su escena, es posible que desee poder generarlos sobre la marcha. Por ejemplo, si tu jugador tiene algún tipo de lanzador de proyectiles, es posible que desees poder crear proyectiles sobre la marcha que tengan su propia lógica encapsulada para volar, infligir daño, etc.
Primero tenemos que introducir la noción de prefabricado . Podemos crearlos simplemente arrastrando cualquier GameObject en la jerarquía de escenas a la carpeta de activos.

Esto esencialmente almacena una plantilla del objeto que acabamos de tener en nuestra escena con las mismas configuraciones.

Una vez que tenemos estos componentes prefabricados, podemos asignarlos a las variables del inspector (como mencionamos anteriormente) en cualquier componente de la escena, de modo que podamos crear nuevos GameObjects como lo especifica el prefabricado en cualquier momento.
Luego podemos realizar una 'instanciación' de la casa prefabricada y manipularla en la ubicación deseada en la escena y establecer las relaciones con los padres necesarias.

Acceder a otros GameObjects y componentes
A menudo, necesitamos comunicarnos con otros GameObjects, así como con sus componentes asociados. Una vez que tenga una referencia a un objeto de juego, esto es bastante simple.
ComponentName comp = some_game_object.GetComponent ();Después de eso, puede acceder a cualquiera de los métodos / variables públicos del componente para manipular GameObject. Esta es la parte sencilla, sin embargo, obtener la referencia al GameObject se puede hacer de varias maneras ...
Acceso mediante variable de inspector
Este es el más sencillo. Simplemente cree una variable pública para GameObject, como demostramos anteriormente con las prefabricadas, y arrástrela y suéltela manualmente en el componente a través del inspector. Luego acceda a la variable como arriba.
Acceso mediante etiquetado
Podemos etiquetar GameObjects o prefabs mediante el inspector y luego usar las funciones de búsqueda de objetos del juego para localizar referencias a ellos.

Esto simplemente se hace como se muestra a continuación.
GameObject some_game_object = GameObject.FindGameObjectWithTag ("Bloque");Acceso vía transform
Si deseamos acceder a componentes en algún objeto padre, podemos hacerlo fácilmente a través del atributo transform.
ComponentName comp = gameObject.transform.parent.GetComponent ();Acceso a través de SendMessage
Alternativamente, si queremos enviar un mensaje a muchos otros componentes o queremos enviar un mensaje a un objeto que está muy arriba en una jerarquía anidada, podemos usar las funciones de enviar mensaje, que aceptan el nombre de la función seguido de los argumentos.
gameObject.SendMessage ("MethodName", params); // Emitir mensajegameObject.SendMessageUpwards ("MethodName", params); // Solo lo reciben los componentes que están anidados arriba.Raycasting
Es posible que haya oído hablar de esto antes cuando la gente compara juegos de FPS que están 'basados en la física' o 'basados en rayos'. Raycasting es esencialmente como tener un puntero láser que, cuando entra en contacto con un 'colisionador' o 'cuerpo rígido', devuelve un 'impacto' y devuelve los detalles del objeto.
Hay dos escenarios en los que esto resulta útil (probablemente haya muchos más):
- Si estuvieras diseñando un sistema de armas para un juego, podrías usar la transmisión de rayos para la detección de impactos e incluso personalizar la longitud del rayo para que los elementos cuerpo a cuerpo 'golpeen' solo a distancias cortas
- Cree un rayo desde el puntero del mouse hasta un punto en el espacio 3d, es decir, si desea que el usuario pueda seleccionar unidades con su mouse en un juego de estrategia.

Como puede ver, el código para esto es un poco más complicado. La clave para entender es que para proyectar un rayo hacia donde apunta el mouse en el espacio 3D se requiere la transformación ScreenPointToRay. La razón de esto es que la cámara está renderizando un espacio 3D como una ventana de visualización 2d en la pantalla de su computadora portátil, por lo que, naturalmente, hay una proyección involucrada para transferir de nuevo a 3D.
Detección de colisiones
Anteriormente mencionamos los componentes Collider y Rigidbody que se pueden agregar a un objeto. La regla para las colisiones es que un objeto en la colisión debe tener un cuerpo rígido y el otro un colisionador (o ambos tienen ambos componentes). Tenga en cuenta que al usar raycasting, los rayos solo interactuarán con objetos con componentes de colisionador adjuntos.
Una vez configurado dentro de cualquier componente personalizado adjunto al objeto, podemos usar los métodos OnCollisionEnter, OnCollisionStay y OnCollisionSalir para responder a las colisiones. Una vez que tenemos la información de colisión, podemos hacer responsable al GameObject y usar lo que aprendimos anteriormente para interactuar también con los componentes adjuntos.

Una cosa a tener en cuenta es que los cuerpos rígidos proporcionan física como la gravedad para los objetos, por lo que si desea que esto se desactive, deberá marcar is_kinematic .

Características avanzadas
No entraremos en nada de esto ahora, pero quizás en un artículo futuro, solo para que sepas que existen.
Creando GUI
Unity tiene un motor de interfaz de usuario completo para diseñar la interfaz gráfica de usuario de tu juego. En general, estos componentes funcionan de manera bastante similar al resto del motor.
Ampliación del editor de Unity
Unity te permite agregar botones personalizados a tus inspectores para que puedas afectar al mundo durante el modo de edición. Por ejemplo, para ayudar con la construcción del mundo, puede desarrollar una ventana de herramientas personalizada para construir casas modulares.
Animación
Unity tiene un sistema de animación basado en gráficos que le permite combinar y controlar animaciones en varios objetos, como jugadores que implementan un sistema de animación basado en huesos.
Materiales y PBR
Unity funciona con un motor de renderizado basado en la física que permite iluminación en tiempo real y materiales realistas. La realidad es que primero tendrás que aprender a modelar en 3D o usar modelos creados y optimizados por otra persona antes de llegar a esto, para hacer cosas que realmente se vean bien.
Consejos para los recién llegados
Si planeas escribir tu primer juego, no subestimes la complejidad y el tiempo que lleva escribir incluso los juegos más triviales. ¡Recuerda que la mayoría de los juegos que salen en Steam tienen equipos trabajando en ellos durante años a tiempo completo!
Elija un concepto simple y divídalo en pequeños hitos alcanzables. Es muy recomendable separar el juego en componentes independientes tan pequeños como sea posible, ya que es mucho menos probable que te encuentres con errores si mantienes los componentes simples en lugar de bloques de código monolíticos.
Antes de escribir cualquier código para cualquier parte de su juego, vaya e investigue lo que otra persona ha hecho antes para resolver el mismo problema; es probable que tengan una solución mucho más hábil.
Recursos y comunidades agradables
El diseño de juegos tiene una de las mejores comunidades que existen, y hay un montón de profesionales altamente capacitados en la industria que publican contenido gratis o por casi nada. Es un campo que requiere modeladores 3D, artistas conceptuales, diseñadores de juegos, programadores, etc. He vinculado algunos recursos generales excelentes que he encontrado para cada uno de estos campos a continuación:
Arte conceptual
- Escuela de diseño Feng Zhu (más de 90 horas de tutoriales de arte conceptual)
- Tyler Edlin Art (Gran comunidad de arte BST con comentarios de profesionales sobre desafíos mensuales)
- Art Cafe (entrevistas y talleres con artistas conceptuales famosos)
- Trent Kaniuga (ilustrador y artista 2D que también está haciendo su propio juego)
Modelado 3D
- CG Cookie (Los mejores conceptos básicos de modelado de mallas en Blender, tienen muchos otros contenidos excelentes para Blender)
- Tor Frick (Modeladores y escultores de superficies duras en Blender)
- Gleb Alexandrov (tutoriales breves y potentes de renderizado en Blender)
Diseño de juego
- DoubleFine Amnesia Fortnight (GameDevs que hacen un hackathon de 2 semanas y registran todo su proceso de diseño)
- Kit de herramientas de GameMakers (examina los principios de diseño de juegos)
Programación
- Héroe hecho a mano (escribiendo un juego y un motor desde cero en C)
- Jonathan Blow (desarrollador independiente que transmite en vivo el desarrollo de su juego)
- Brackeys (tutoriales de Nice Unity)
Conclusión
¡Espero que les haya gustado este tutorial! Hago un poco de trabajo de diseño gráfico, así como prototipos de juegos y UI, ¡así que mira mi portafolio ! También estoy vinculado .
portafolio| LinkedIn
