¡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..
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.
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:
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.
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..
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..
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.
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.
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..
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:
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.!
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));
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..
Ahora necesitamos crear el script que destruirá y los objetos que se desvíen del límite.
Límite de clase pública: MonoBehaviour void OnTriggerExit (Coleccionista otro) Destroy (other.gameObject);
Necesitamos una forma de ganar nuestro nivel. Para hacer esto, nuestros bloques deben ser destruidos si reciben suficiente daño de los impactos.
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");
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..
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..
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.
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