Cómo hacer que un objeto se rompa en fragmentos más pequeños en Unity
() translation by (you can also view the original English article)
En este tutorial te mostraré cómo crear un simple efecto demoledor para tu juego Unity. En lugar de simplemente "eliminar" una caja (o cualquier otro objeto) cuando es golpeada o destruida, podemos hacer que se astille en pedazos más pequeños.
Requisitos
Para este tutorial, necesitará la versión más reciente de Unity y algo de experiencia básica con él. Para el efecto más avanzado más adelante en el tutorial, también será necesaria una herramienta de modelado 3D. Si no tiene uno disponible o no quiere modelar los objetos por ti mismo, los he incluido en la descarga. (Los archivos de Unity también están disponibles allí).
En la versión básica de este efecto, se destruirá un cubo, dejando a su paso varios fragmentos que caerán de manera realista al suelo:






Más tarde, cambiaremos el cubo por un modelo barril más complicado:






Puede probarlo aquí:



Configuración básica
Cree un nuevo proyecto de Unity y abra una nueva escena. Crea un avión, que actuará como nuestro suelo, y un cubo, que será el objeto destructible. Además, coloque una luz direccional para hacer las cosas más visibles. Cree dos nuevos materiales y asígnelos al piso y al cubo, para que podamos distinguirlos, y mueva la cámara para que todo se pueda ver:



Destruyendo el cubo
Hay muchas formas de "destruir" el cubo. Por ahora, tomaremos el enfoque más simple posible.
Cree un nuevo archivo JavaScript y asígnele el nombre destructionController.js
. En esto, pondremos toda la funcionalidad de eliminar el cubo y crear los fragmentos. Agregue las siguientes líneas:
1 |
|
2 |
function Update() |
3 |
{
|
4 |
if(Input.GetKey(Keycode.space)) |
5 |
{ |
6 |
Destroy(gameObject); |
7 |
} |
8 |
}
|
Ahora, agregue el script al cubo arrastrándolo sobre él. Inicia el juego y haz una prueba. Si presiona la barra espaciadora, el cubo debe eliminarse.



Después de eliminarlo, ya no aparecerá en la jerarquía, como puede ver en la captura de pantalla.
Creando los fragmentos
Ahora crea ocho cubos más pequeños; Estos serán los "fragmentos" del cubo actual. Dales el mismo material que el cubo. (No se preocupe por el aspecto, los haremos lucir increíbles más adelante). Deberían verse así:



Apila los 8 cubos para formar un cubo único más grande, sin que se crucen:



Dale a cada cubo un cuerpo rígido, establece su masa en 22
, activa el uso de la gravedad y desactiva la cinemática. Esto hará que los fragmentos se caigan y usen la física. Si lo deseas, puede ajustar estos valores más adelante para producir resultados que se adapten mejor a su juego.



Ahora, agrupa los cubos bajo un nuevo vacío gameObjec
y llámalo remainsCube
. Cuando se destruye el cubo original, se reemplazará con este nuevo objeto hecho de cubos más pequeños.



Arrastre el objeto remainsCube
a la carpeta del proyecto para crear un prefabricado. Una vez que esté seguro en la carpeta prefabricada, elimínelo de la escena principal y estará listo para usar.
Hacer aparecer los restos
Agregue las líneas resaltadas al script destructController
:
1 |
|
2 |
var remains: GameObject; |
3 |
function Update() |
4 |
{
|
5 |
if(Input.GetKey(Keycode.space)) |
6 |
{
|
7 |
Instantiate(remains, transform.position, transform.rotation); |
8 |
Destroy(gameObject); |
9 |
}
|
10 |
}
|
Esto creará una copia de los restos en la posición exacta del cubo. Luego, el cubo será removido, dando la ilusión de que el nuevo es en realidad el viejo, pero "roto".
Para que esto funcione, debe asignar manualmente los restos al cubo. Haga clic en él, y en el Inspector debería ver una pestaña que contiene el script Destruction Controller. Debe haber una ranura llamada Remains, que actualmente debe estar vacía. Arrastre el prefabricado remains
desde la carpeta del proyecto a esta ranura. El script Destruction Controller en el Inspector debería verse así:



Primeras optimizaciones
¡Haz una prueba! Si todo está configurado correctamente, cuando presiona la barra espaciadora, los restos deben reemplazar el cubo. Si tienes suerte, deberían caer al suelo.
Entonces, este cubo básico:



...debería convertirse en algo similar a esto:



No tuve suerte
Lamentablemente, no está garantizado que los fragmentos se caigan de una manera agradable. Afortunadamente, hay formas de resolver eso.
Crea un nuevo vacío gameObject
y dale un colisionador de esferas, pero no un cuerpo rígido. Tire los restos en la escena, para que pueda editarlos. Agregue el objeto colisionador de esfera a los restos y colóquelo de manera que se cruce con algunos de los cubos:



Ahora, los fragmentos colisionarán inmediatamente con la esfera, creando un efecto de caída:






Retirar los fragmentos
Dependiendo del juego que estés creando, no podemos permitirnos muchas "astillas" a la vez en una escena. La solución directa es eliminarlos después de unos segundos. Para hacerlo, cree un nuevo archivo JavaScript y asígnele el nombre selfDestruct.js
. Escribe el siguiente código:
1 |
|
2 |
function Start() |
3 |
{
|
4 |
yield WaitForSeconds(4.0); |
5 |
Destroy(gameObject); |
6 |
}
|
Cuando se crea el objeto, esperará cuatro segundos y luego se eliminará. Agregue este código al objeto remains
. Si ahora destruyes el cubo y creas los fragmentos, los restos se destruirán después de cuatro segundos.
¡Y eso es! Ahora tiene los conceptos básicos para que un objeto "se rompa" de manera eficiente en varias piezas más pequeñas cuando se destruye. Puede usar este efecto tal cual, pero vamos un poco más allá y lo usaremos con un objeto más complejo.
Usar un objeto real en lugar de cubos
Ahora que tenemos el sistema básico en su lugar, podemos hacerlo más bonito reemplazando los cubos con objetos reales.



Si eres experto en una herramienta de modelado 3D, puedes crear tus propios objetos. De lo contrario, puedes obtener el archivo 3D preparado de la descarga.
Copie el archivo en su carpeta de activos y los modelos 3D se importarán automáticamente para su uso. Antes de usarlos, haga clic en el archivo en el Asset Explorer y asegúrese de que los archivos de origen se importen correctamente en un factor de escala de 1
(no 0.1
o 0.001
; eso solo complica las cosas).



Si observas los objetos, puedes ver un campo llamado meshfilter en el Inspector. Si hace clic en él, obtendrás una lista de todas las mallas disponibles en el proyecto. Ahora reemplace todos los cubos en los Cube remians con partes de barril.



El cubo intacto obtiene la malla barrel
; los fragmentos de cubo más pequeños necesitan las mallas barrel_fragment_01
a barrel_fragment_08
. Después de asignarlos, establezca sus posiciones locales en (0, 0, 0)
. (Sus puntos de pivote se han establecido para que puedan ponerse a cero fácilmente de esa manera).
En lugar de un colisionador de caja, un colisionador malla sería mucho más conveniente. Retire todos los colisionadores caja en los fragmentos y reemplácelos con colisionadores malla. Verifique cada colisionador de malla y asegúrese de que cada uno tenga la malla correcta aplicada (es decir,
barril_fragmento_01
necesita la malla barrel_fragment_01
, y así sucesivamente).



Una vez hecho esto, configure todos los colisionadores malla como convex
. (Un colisionador de malla no convexo no puede chocar con otros colisionadores de malla no convexo. Es una cuestión de programación). Además, elimine el colisionador esfera que agregamos a los restos, ya que podría no ser necesario.
Si todo está configurado correctamente, deberías tener un barril que se separará en ocho piezas más pequeñas.
Posibles detalles adicionales
El mismo sistema también se puede utilizar para agregar otros efectos a la destrucción. ¿Tienes una explosión? ¡Agrégala! Agregue sonidos, para una grieta satisfactoria. Pon un efecto allí, creando una pequeña nube de humo.
Conclusión
En este tutorial te he mostrado la forma más sencilla de hacer que un objeto se rompa en fragmentos más pequeños. Ahora sabes cómo destruir un objeto, eliminándolo del juego; cómo intercambiar el objeto con fragmentos más pequeños directamente antes de su destrucción; y cómo hacer que los fragmentos se autodestruyan después.
Este sistema ahora se puede modificar y adaptar para adaptarse a muchos propósitos específicos. Podrías tener una caja o una astilla de barril y romperse cuando te disparan. Podría crear una explosión después de que un avión sea golpeado. O podrías hacer que un bote se rompa en dos pedazos. ¡Disfrutar!