Advertisement
  1. Game Development
  2. Programming

Cómo hacer que un objeto se rompa en fragmentos más pequeños en Unity

Scroll to top
Read Time: 7 min

() 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:

splintering_02_cube_intactsplintering_02_cube_intactsplintering_02_cube_intact
splintering_03_cube_brokensplintering_03_cube_brokensplintering_03_cube_broken

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

splintering_04_barrel_intactsplintering_04_barrel_intactsplintering_04_barrel_intact
splintering_05_barrel_brokensplintering_05_barrel_brokensplintering_05_barrel_broken

Puede probarlo aquí:

barrel_demo_screenshotbarrel_demo_screenshotbarrel_demo_screenshot
Haz clic para probar la demo. (La demostración del cubo también está disponible 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:

splintering_01_setupsplintering_01_setupsplintering_01_setup

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.

splintering_06_cube_deletedsplintering_06_cube_deletedsplintering_06_cube_deleted

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í:

splintering_07_fragments_01splintering_07_fragments_01splintering_07_fragments_01

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

splintering_07_fragments_02splintering_07_fragments_02splintering_07_fragments_02

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.

splintering_09_fragments_04splintering_09_fragments_04splintering_09_fragments_04

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.

splintering_08_fragments_03splintering_08_fragments_03splintering_08_fragments_03

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í:

splintering_16_prefab_assignsplintering_16_prefab_assignsplintering_16_prefab_assign

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:

splintering_02_cube_intactsplintering_02_cube_intactsplintering_02_cube_intact

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

splintering_10_unluckysplintering_10_unluckysplintering_10_unlucky

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:

splintering_17_spheresplintering_17_spheresplintering_17_sphere

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

splintering_02_cube_intactsplintering_02_cube_intactsplintering_02_cube_intact
splintering_11_bettersplintering_11_bettersplintering_11_better

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.

splintering_05_barrel_brokensplintering_05_barrel_brokensplintering_05_barrel_broken

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).

splintering_12_importersplintering_12_importersplintering_12_importer

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.

splintering_13_barrel_01splintering_13_barrel_01splintering_13_barrel_01

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).

splintering_15_barrel_03splintering_15_barrel_03splintering_15_barrel_03

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!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Game Development tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.