Puede utilizar un sistema de partículas para crear una explosión convincente pero la dinámica es quizá un poco más complicada de lo que parece en un primer momento. Esencialmente, una explosión es una explosión externa de partículas pero hay algunas modificaciones simples que se pueden utilizar para que parezca mucho más realista.
Una simple explosión produce una bola de fuego que expande hacia afuera rápidamente en todas las direcciones. La explosión inicial tiene mucha energía y por lo tanto es muy caliente (es decir, brillante) y se mueve bastante rápido. Esta energía se disipa rápidamente lo cual resulta en la expansión de una llama disminuyendo y también enfriando (es decir, se vuelve menos brillante). Finalmente, como todo el combustible se quema, las llamas morirán y pronto desaparecerán por completo.
Una partícula de explosión típicamente tendrá un corto tiempo de vida y usted puede variar varias propiedades en el tiempo para simular el efecto. La partícula comenzará a moverse muy rápido pero luego su velocidad se debería reducir en gran medida a medida que se aleja del centro de la explosión. También, el color debería empezar brillante pero luego oscurecerse y eventualmente desvanecerse a un transparente. Finalmente, reducir el tamaño de las partículas en el tiempo dará el efecto de las llamas se dispersarán a medida que el combustible se utilice.
Comenzando con el objeto del sistema de partículas predeterminado (menú: GameObject > Effects > Particle System), vaya al módulo Shape y establezca la forma del emisor en un Sphere pequeño, por ejemplo, alrededor de 0,5 unidades de radio. Las partículas en los Standard Assets incluyen un material llamado ParticleFireball que es muy adecuado para explosiones (menú: Assets & gt; Import Package & gt; ParticleSystems). Puede configurar este material para el sistema utilizando el módulo Renderer. Con el Renderer abierto, también debe desactivar Cast Shadows y Receive Shadows, ya que se supone que las llamas de la explosión emiten luz en lugar de recibirla.
En esta etapa, el sistema parece que se lanzan muchas pequeñas bolas de fuego desde un punto central. La explosión debería, por supuesto, crear una explosión con muchas partículas a la vez. En el módulo Emission, puede establecer el valor Rate en cero y agregar un solo Burst de partículas en el tiempo cero. El número de partículas en el estallido dependerá del tamaño y la intensidad que desee que tenga su explosión, pero un buen punto de partida es aproximadamente cincuenta partículas. Con la ráfaga configurada, el sistema ahora comienza a parecerse mucho más a una explosión, pero es bastante lento y las llamas parecen estar suspendidas por un largo tiempo. En el módulo Sistema de partículas (que tendrá el mismo nombre que GameObject, por ejemplo, “Explosión”), establezca la duración del sistema y la duración de las partículas de inicio en dos segundos.
También puede usar el módulo Size Over Lifetime para crear el efecto de las llamas usando su combustible. Establezca la curva de tamaño utilizando el ajuste preestablecido de “ramp down” (es decir, el tamaño comienza en 100% y se reduce a cero. Para que las llamas se oscurezcan y desaparezcan, active el módulo Color Over Lifetime y establezca el gradiente para comenzar con blanco en el a la izquierda y finalice con el negro a la derecha. El material Fire Add utiliza un sombreador aditivo para el renderizado, por lo que la oscuridad de la propiedad del color también controla la transparencia de la partícula, las llamas se volverán completamente transparentes a medida que el color se torne negro. El material aditivo permite que el brillo de las partículas se “añada” a medida que se dibujan unas sobre otras. Esto ayuda a mejorar aún más la impresión de un destello brillante al comienzo de la explosión cuando las partículas están todas juntas.
Como está, la explosión está tomando forma pero se ve como si estuviera sucediendo afuera en el espacio. Las partículas son lanzadas hacia afuera y viajan una larga distancia con una velocidad constante antes de desvanecerse. Si su juego está en el espacio entonces este podría ser el efecto que usted desea. Sin embargo, una explosión que ocurre en la atmósfera disminuirá y amortiguado por el aire que la rodea. Habilite el módulo Limit Velocity Over Lifetime y configure la Speed a 3.0 y la fracción Dampen a 0.4 y usted debería ver que la explosión pierde fuerza a medida que progresa.
Una última cosa para tener en cuenta es que a medida que las partículas se mueven lejos del centro de la explosión, sus formas individuales se vuelven más reconocibles. En particular, ver todas las partículas con el mismo tamaño y con la misma rotación hace que sea obvio que la misma gráfica sea re-utilizada para cada partícula. Una manera simple de evitar esto es agregar un poco de una variación aleatoria al tamaño y rotación de las partículas a medida que son generadas. En el módulo Particle System, encima del inspector, oprima la pequeña flecha a la derecha de las propiedades Start Size y Start Rotation y configure ambas a Random Between Two Constants. Para la rotación, configure ambos valores a 0 y 360 (es decir, una rotación completamente aleatoria). Para el tamaño configure los valores a 0.5 y 1.5 para darle alguna variación sin arriesgarse en tener partículas gigantes o chiquitas. Usted debería ver que la repetición gráfica de las partículas se nota mucho menos.
Durante las pruebas, es útil tener la propiedad Looping prendida para que usted pueda ver la explosión varias veces pero en el juego terminado, usted debería apagar esto para que la explosión suceda solamente una vez. Cuando la explosión está diseñada para un objeto que tiene el potencial en explotar (un tanque de combustible digamos) usted podría querer agregar el componente Particle System al objeto con la propiedad Play On Awake desactivada. Usted puede luego apagar la explosión desde script si es necesario.
void Explode() {
var exp = GetComponent<ParticleSystem>();
exp.Play();
Destroy(gameObject, exp.duration);
}
En otros casos, las explosiones suceden en algunos puntos de impacto. Si la explosión origina desde un objeto (digamos una granada) entonces usted podría llamar la función Explode
detallada arriba después de una demora en el tiempo o cuando haga contacto con el objetivo.
// Granada explota después de un retraso de tiempo.
public float fuseTime;
void Start() {
Invoke("Explode", fuseTime);
}
// Granada explota en el impacto.
void OnCollisionEnter(Collision coll) {
Explode();
}
Dónde la explosión venga de un objeto que en realidad no está representando en el juego (es decir, un proyectil que viaja muy rápido para ser visto), usted puede simplemente instanciar una explosión en el lugar apropiado. Usted podría determinar el punto de contacto desde un raycast, por ejemplo.
//En el objeto explosivo
void Start() {
var exp = GetComponent<ParticleSystem>();
exp.Play();
Destroy(gameObject, exp.duration);
}
// Script posible del projectile.
public GameObject explosionPrefab;
void Update() {
RaycastHit hit;
if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hit)) {
Instantiate (explosionPrefab, hit.point, Quaternion.identity);
}
}
La explosión desarrollada aquí es muy básica pero usted puede modificarla en varios aspectos para obtener la sensación exacta que usted está buscando en su juego.
El gráfico de la partícula que usted utiliza tendrá un efecto grande en cómo el jugador “lee” la explosión. Al tener muchas llamas pequeñas, separadas reconocibles sugiere unas piezas que se están quemando lanzadas hacia fuera. Unas partículas más grandes que no se muevan completamente a aparte parecen como si fueran una bola de fuego alimentada por un tanque destruido. Típicamente, usted tendrá que cambiar varias propiedades en conjunto para completar el efecto. Por ejemplo, la bola de fuego durará más y se expandirá menos antes de que desaparezca mientras que una ráfaga aguda puede dispersar unas piezas quemándose alguna distancia.
Unas pocas propiedades están configuradas con valores aleatorias aquí pero otras muchas propiedades tienen una opción Random Between Two Constants/Curves y usted puede utilizarlas para agregar variación en todos sentidos. Al variar el tamaño y rotación ayuda evitar los efectos más obvios de la repetición de partículas pero usted puede también considerar agregar algo de aleatorio a las propiedades Start Delay, Start Lifetime y Start Speed. Una pequeña cantidad de variaciones ayuda reforzar la impresión de una explosión “natural” con un efecto impredecible en vez de un proceso mecánico controlado. Unas variaciones más grandes sugieren una explosión más “sucia”. Por ejemplo, variar Start Delay producirá una explosión de que ya no es aguda pero se dispara más lento, de pronto porque los tanques de combustión de un vehículo están siendo encendidos por separado.
2017–09–19 Page amended
Menú GameObject cambiado en Unity 4.6