Trabajando con la física de Unity3D

¡Este tutorial te enseñará cómo construir un juego derribado con Unity3D! A lo largo del camino, aprenderá sobre la importancia de usar un motor de física y cómo hacerlo ahorrará innumerables horas de animación manual. Sigue leyendo!

¿Qué moderno motor de juego estaría completo sin un motor de física? Cada motor de juego actual, ya sea en 3D o 2D, tiene una biblioteca de física de algún tipo, y Unity no es una excepción. La física en tiempo real es ideal para simular interacciones complejas entre objetos en tu juego. Un motor de física puede ahorrar una gran cantidad de codificación manual y animación para lograr un movimiento realista, puede hacer que la detección de golpes sea muy fácil y puede introducir rápidamente una gran cantidad de nuevas mecánicas de juego en sus juegos..

En este tutorial, usaremos el motor de física en Unity para construir un juego de caída en 3D similar a BoomBlox y Angry Birds. Aprenderemos cómo dar a los objetos diferentes propiedades físicas, hacerlos capaces de chocar e incluso permitir que se destruyan si las colisiones son lo suficientemente fuertes..


¿Qué es un motor de física??

Un motor de física funciona simulando cómo los objetos reaccionan entre sí cuando se les aplican fuerzas. Estas fuerzas pueden ser constantes, como la gravedad o el impulso de un vehículo, mientras que otras son breves y poderosas, como las explosiones. Una simulación física a veces se denomina "caja de arena" porque solo se impactan los objetos dentro de la simulación. De hecho, no todos los objetos de tu juego tienen que formar parte de la simulación. Esto es importante ya que los movimientos de los jugadores a menudo tienen que ser poco realistas mientras siguen respondiendo de manera realista a las colisiones.


Configuración del proyecto

  • Haga clic en Archivo> Nuevo proyecto
  • Busque una carpeta adecuada y nombre el proyecto CannonBowl
  • Haga clic en crear
  • Haga clic en GameObject> Crear otro> Luz direccional
  • Haga clic en Archivo> Guardar escena
  • Nombra la escena Principal
  • Clic en Guardar

Colisionadores

Los colisionadores son lo que los motores de física utilizan para realizar la detección de golpes. A diferencia de los objetos de malla, ellos saben cuándo han estado en contacto unos con otros. Son formas simples como cajas, esferas o cápsulas que se asignan a tus GameObjects y las siguen. Puedes pensar en ellos como algo así como un "campo de fuerza".

Convenientemente, cada vez que se crea un GameObject, se le asigna automáticamente un colisionador apropiado. Un cubo obtiene un BoxCollider, una Esfera obtiene un SphereCollider, un Cilindro obtiene un CapsuleCollider, y así sucesivamente.

Eventualmente necesitaremos algunos bloques para derribar:

  • Haga clic en GameObject> Crear otro> Cubo
  • Renombrar el Cubo a Bloque de madera
  • Establezca la posición del Bloque en 0, 0, 0. Esto centrará el Bloque en el mundo
  • Descargar Wood.jpg
  • Arrastre Wood.jpg a su panel de Proyecto para convertirlo en una textura
  • Arrastre la textura de madera al bloque en la vista de escena, esto creará automáticamente un material de madera para nosotros y lo aplicará al bloque
  • Arrastre el bloque desde el panel Jerarquía al panel Proyecto para convertirlo en una Prefab.

Si presionamos Play, el bloque no hará nada. Si bien tiene un colisionador, carece de un cuerpo rígido, por lo que no está afectado por ninguna fuerza física.


Cuerpos rígidos

Un cuerpo rígido es el elemento más crítico en un motor de física. Cualquier GameObject al que esté adjunto se incluye en la simulación..

  • Seleccione el bloque de prefab en el panel Proyecto
  • Haga clic en Componente> Física> Rigidbody

Por defecto, un cuerpo rígido se ve afectado por la gravedad y la resistencia del aire, también conocida como arrastre. Si presionamos Reproducir, el bloque comenzará a caer, acelerará y, finalmente, alcanzará la velocidad máxima cuando la fuerza de la gravedad y el arrastre se igualen..


Construir una estructura

Tendremos que crear algunos elementos más para construir un nivel adecuado. Primero, agreguemos algo de terreno para que el bloque tenga algo para aterrizar.

  • Haga clic en GameObject> Crear otro> Plano
  • Renombrar el plano a Suelo
  • Establezca la posición del suelo en 0, 0, 0
  • Descargar Grass.jpg
  • Arrastra Grass.jpg a tu panel de Proyecto para que sea una textura
  • Arrastre la textura Grass al suelo en la vista de escena

El Ground recibirá automáticamente un MeshCollider que evitará que cualquier cuerpo rígido pase a través de él. Pulsa Play y el Bloque debería caer y asentarse sobre el suelo..

Ahora necesitamos una estructura para derribar. Selecciona el Bloque y presiona Ctrl + D en Windows, o Cmd + D En OSX, para duplicar el Bloque unas cuantas veces. Use la escala y mueva las herramientas para estirar y posicionar los bloques en aproximadamente la misma configuración que la imagen de abajo.

NOTA: Es una buena idea usar números precisos para sus transformaciones. Los bloques deben descansar uno contra el otro, pero no superponerse. Las superposiciones harán que el motor de física se vuelva loco y haga cosas impredecibles.


Controles de camara

Ahora que hemos creado nuestra hermosa estructura, escribamos un script que nos permita mover la cámara para poder admirar nuestra creación desde todos los ángulos..

  • Haga clic en Activos> Crear> Script C #
  • Cambiar el nombre del script a Cañón (porque eventualmente nuestra cámara estará haciendo el rodaje)
  • Arrastra el script a la cámara principal
  • Haga doble clic en el script para editarlo.

La siguiente secuencia de comandos hará que la cámara orbite alrededor del centro del mundo, así como que se incline hacia arriba y hacia abajo:

 Cannon de clase pública: MonoBehaviour void LateUpdate () float x = Input.GetAxis ("Mouse X") * 2; float y = -Input.GetAxis ("Mouse Y"); // flotador de inclinación vertical yClamped = transform.eulerAngles.x + y; transform.rotation = Quaternion.Euler (yClamped, transform.eulerAngles.y, transform.eulerAngles.z); // transformación orbital horizontal.RotateAround (nuevo Vector3 (0, 3, 0), Vector3.up, x); 

Como toque final, hagamos que sea más fácil apuntar agregando un punto de mira a nuestra cámara:

  • Haga clic en GameObjects> Crear> Plano
  • Renombrar el plano a Punto de mira
  • Establezca la posición de la cruz en 0, 0, 0
  • Descargar Crosshair.png
  • Arrastre Crosshair.png al panel Proyecto
  • Arrastre la textura en forma de cruz al plano en forma de cruz en el panel Escena
  • En el Inspector, haga clic derecho en el componente MeshCollider y elimínelo para que no afecte a otros objetos físicos en la escena.

Disparando balas de cañon

Poder mirar nuestra estructura está bien, ¡pero se supone que se trata de física! Necesitamos una manera de derribarla para ver la física en acción. Lo que necesitamos es algo para disparar.!

  • Haga clic en GameObject> Crear otro> Esfera
  • Renombrar la esfera a Bala de cañón
  • Establezca la posición de la bala de cañón en 0, 0, 0
  • Con la bala de cañón seleccionada, haga clic en Componentes> Física> Cuerpo rígido
  • Arrastre Cannonball del panel Jerarquía al panel Proyecto para convertirlo en una Prefab.

Como vamos a disparar balas de cañón directamente desde la cámara, podemos editar nuestro script Cannon existente. Primero, agregamos un atributo público en la parte superior de la clase para nuestra prefab de proyectiles.

 Cannon de clase pública: MonoBehaviour public GameObject projectilePrefab;

Agregamos un método FixedUpdate para escuchar el botón "Fire1" que se debe presionar y luego crear una instancia de Cannabball prefab, colocarlo en la cámara y luego agregarle una fuerza para avanzar..

 void FixedUpdate () if (Input.GetButtonDown ("Fire1")) GameObject proyectile = Instantiate (projectilePrefab, transform.position, transform.rotation) como GameObject; projectile.rigidbody.AddRelativeForce (new Vector3 (0, 0, 2000)); 

Límites

Es posible que haya notado que si una bala de cañón se dispara lo suficientemente lejos, puede caerse del borde de nuestro plano de tierra. Esta bala de cañón continuará existiendo mientras el juego se siga ejecutando y su física continuará siendo calculada, lo que eventualmente ralentizará las cosas. Necesitamos crear un límite alrededor del nivel y destruir cualquier objeto del juego que deje este límite..

  • Haga clic en GameObject> Crear vacío
  • Renombrarlo a Límite
  • Establezca las posiciones x, y y z del límite en 0
  • Con el límite seleccionado, haga clic en Componentes> Física> Recolector de cajas
  • En el insepctor, asegúrese de que la opción Activar está activada
  • Establece el Centro de Box Collider en 0, 25, 0
  • Establece el tamaño de Box Collider en 50, 50, 50

Ahora necesitamos crear el script que destruirá y los objetos que se desvíen del límite.

  • Haga clic en Activos> Crear> Script C #
  • Cambiar el nombre del script a Límite
  • Arrastre el script al objeto de límite en el panel Jerarquía
  • Edita el script y agrega el siguiente código
 Límite de clase pública: MonoBehaviour void OnTriggerExit (Coleccionista otro) Destroy (other.gameObject); 

Causando la destrucción

Necesitamos una forma de ganar nuestro nivel. Para hacer esto, nuestros bloques deben ser destruidos si reciben suficiente daño de los impactos.

  • Haga clic en Activos> Crear> Script C #
  • Cambiar el nombre del script a Bloquear
  • Arrastre la secuencia de comandos al Bloque de prefab en el panel Proyecto
  • Haga doble clic en el script en el panel Proyecto para editarlo.

En el guión, asignamos a la prefab una propiedad de salud pública que se puede ajustar en el editor. Esto permite que diferentes bloques tengan diferentes cantidades de salud..

 bloque de clase pública: MonoBehaviour salud pública flotante = 20;

Cuando se detecta una colisión, se mide la magnitud del impacto. Cuanto mayor es la magnitud, más daño se hizo. Todo lo que esté por encima de un golpecito ligero se resta de la salud del bloque. Si la salud del bloque cae por debajo de 0, el bloque se destruye a sí mismo. Luego verifica cuántos bloques restantes quedan en la escena. Si solo queda un bloque, el juego termina y vuelve a cargar la escena para volver a jugar..

 void OnCollisionEnter (Colisión de colisión) // aplicar daño de colisión si (collision.relativeVelocity.magnitude> 0.5) health - = collision.relativeVelocity.magnitude;  // destruir si la salud es demasiado baja si (salud <= 0)  Destroy(gameObject); // restart the scene if this was the last box GameObject[] boxes = GameObject.FindGameObjectsWithTag("Box"); if (boxes.Length <= 1)  Application.LoadLevel("Main");   

Bloques de concreto

Hasta ahora, solo hemos estado utilizando bloques de madera. Son ligeros y relativamente débiles, lo que hace que la estructura sea demasiado fácil de destruir y bastante predecible en cuanto a cómo se moverá. Necesitamos crear otro tipo de bloque, uno que sea tanto más pesado como más fuerte..

  • En el panel Proyecto, duplique el prefab WoodBlock (Ctrl + D en Windows, Cmd + D en OSX)
  • Renombra el duplicado a Bloque de concreto
  • Descargar Concrete.jpg
  • Arrastre Concrete.jpg en el panel Proyecto
  • Arrastre la textura de hormigón a la prefabricada ConcreteBlock en el panel Proyecto
  • Con el prefab seleccionado, use el Inspector para actualizar el estado a 50
  • En el componente Rigidbody, aumenta la masa a 5 para hacerla más pesada
  • Arrastra el prefabricado ConcreteBlock en la escena

Trate de reemplazar algunos de los miembros transversales con bloques de hormigón. Los bloques de hormigón deben ser más difíciles de derribar, caer con gran impacto y ser más difíciles de destruir con balas de cañón..


Juego terminado

A continuación se muestra el juego terminado que se ejecuta en Unity Web Player. Usa el mouse para orbitar la cámara y presiona Ctrl o el botón izquierdo del mouse para disparar balas de cañón.




Conclusión

Este tutorial solo araña la superficie de lo que es capaz el motor de física de Unity. Fuerzas constantes, fuerzas explosivas, materiales físicos, bisagras, resortes, ragdolls, etc. Si bien esto puede parecer desalentador, los elementos del motor de física de Unity se combinan, por lo que es fácil de entender y de implementar la física en sus juegos..

Para obtener más información sobre las capacidades del motor de física de Unity, visite:

http://docs.unity3d.com/Documentation/Manual/Physics.html