Ir al contenido

Dos Modos: Emit y Animate

Hasta ahora, todas las partículas que has visto en este códex han sido duplicados de corta vida. El motor duplica el RenderTemplate, le asigna al duplicado su propia edad y sus propios valores generados aleatoriamente, lo anima durante una fracción de segundo y lo destruye. Muchos duplicados, cada uno independiente. A esto lo llamamos modo Emit.

Hay una segunda forma en que un emisor puede comportarse. En lugar de crear duplicados, el plugin anima la instancia original en su lugar, en bucle. Una sola fuente, sin duplicados, solo los gráficos que has creado reproduciéndose repetidamente mientras el emisor está activo. A esto lo llamamos modo Animate.

Ambos modos utilizan el mismo panel de propiedades, los mismos gráficos, todo lo que has creado. La diferencia radica en si el motor duplica y anima muchas partículas, o anima la propia fuente.

Estableces el Rate en 30 y activas Enabled. Cada 1/30 de segundo, el motor emite.

Pero, ¿qué hace exactamente una “emisión”? Cuando solicitas treinta partículas por segundo, el plugin no puede simplemente entregarte treinta copias idénticas — eso parecería producido en masa. Cada partícula necesita una pequeña variación: una duración ligeramente diferente, una dirección ligeramente diferente, una muestra de gráfico ligeramente diferente. Así es como cada emisión produce eso:

  1. Duplicar el RenderTemplate. Esta es la nueva partícula. Se parece a tu instancia de creación, despojada de elementos de seguimiento (el capítulo 3 explicó por qué).
  2. Elegir un Lifetime aleatorio dentro de tu rango. Si estableces 0.5,1.5, el motor elige algún valor intermedio.
  3. Elegir una dirección aleatoria dentro de tu cono de dispersión. Dos partículas emitidas en el mismo instante apuntan en direcciones ligeramente distintas.
  4. Asignarle una semilla única. Esto impulsa la variación de envolvente en cada gráfico — de modo que dos partículas a la misma edad muestreen colores, tamaños y transparencias ligeramente diferentes.
  5. Entregarla a la simulación. A partir de aquí, el motor actualiza las propiedades de este duplicado en cada fotograma: determinando en qué punto de su vida útil se encuentra la partícula, evaluando cada gráfico en ese punto y escribiendo el resultado de vuelta. Cuando la vida útil se agota, el motor destruye el duplicado.

Muchas emisiones por segundo, cada una independiente, cada una ejecutando este nacimiento de cinco pasos.

En cualquier momento puede haber 30, 100, 500 duplicados activos — dependiendo de Rate y Lifetime. Cada uno a una edad diferente, cada uno reproduciendo los mismos gráficos pero desfasado en el tiempo.

Este es el aspecto clásico de un sistema de partículas. Explosiones de confeti. Chispas. Estelas de humo. Cualquier cosa donde quieras muchos objetos pequeños, cada uno independiente.

Cambias el atributo EmissionMode de tu elemento a Animate. Activas Enabled. El motor no duplica nada.

En su lugar:

  1. La instancia original reproduce los gráficos en su lugar.
  2. En el tiempo 0, los gráficos producen sus valores iniciales; el motor los escribe en la instancia.
  3. En el tiempo 0.5, a mitad del ciclo, los gráficos producen sus valores intermedios; el motor los escribe.
  4. En el tiempo 1, el ciclo se completa; los gráficos vuelven al tiempo 0 y comienzan de nuevo.

Si estableces AnimateLoop = false en el elemento, el motor reproduce un ciclo y se detiene, dejando la instancia en su estado final por un momento antes de restaurar el estado inicial. (Lo mencionamos por completitud; la mayoría de los usos requieren AnimateLoop = true.)

Para los tipos 3D (Part, Attachment, Beam, Model), la descripción anterior es literal — no hay duplicados, no hay lista activa, solo la instancia fuente animándose. Volver a llamar a Animate mientras un ciclo está en ejecución cancela el ciclo actual, devuelve la fuente a su CFrame inicial y comienza de nuevo.

Para los tipos en espacio de pantalla (Blur, Bloom, ColorCorrection, Atmosphere) e ImageLabel, Animate funciona de forma ligeramente diferente internamente: el plugin crea un clon singleton de la fuente, lo anima y lo destruye cuando termina el ciclo. La propia fuente no se renderiza durante el ciclo. Esta es una protección a nivel de plugin para que dos efectos que emiten el mismo emisor en espacio de pantalla no se acumulen de forma descontrolada — volver a llamar a Animate mientras un ciclo está vivo no hace nada (el ciclo existente sigue ejecutándose). La experiencia para el usuario es la misma — un único visual equivalente a la fuente que hace bucle mientras está activo — pero los mecanismos internos difieren.

Esto es útil para efectos ambientales:

  • Un orbe brillante cuyo color pulsa en un bucle.
  • Un beam cuya textura se desplaza eternamente a lo largo de su longitud.
  • Un aura de skybox que cambia de tono a medida que avanza el día.
  • Un elemento de interfaz cuya Transparency sube y baja para atraer la atención.

No usarías Animate para confeti. No usarías Emit para un aura que pulsa lentamente. La elección depende de si el efecto se beneficia de muchas partículas independientes, o de una fuente constante.

Hay un atributo EmissionMode en tu elemento transformado. Dos valores: Emit (predeterminado) o Animate. El panel de propiedades lo muestra como un menú desplegable etiquetado como Mode en la sección Spawning. El nombre del atributo de datos (EmissionMode) es el que usan los scripts mediante item:GetAttribute("EmissionMode") y :SetAttribute("EmissionMode", "Animate").

El modo se lee una vez en el momento en que comienza la emisión — el bucle :Enable en ejecución o el ciclo :EmitAnimate en curso no detectarán si cambias el desplegable después. Cambiar el desplegable en un emisor pausado está bien; la próxima vez que se active Enabled, el nuevo modo entrará en efecto. Cambiarlo en uno que está emitiendo activamente: los duplicados existentes terminan su vida útil de forma natural, pero debes ciclar Enabled (apagarlo y encenderlo) para adoptar el nuevo modo. El equivalente en la API en tiempo de ejecución es llamar a :Disable y luego a :Enable (o :EnableEmit) de nuevo.

El atributo complementario es AnimateLoop (etiqueta en el panel: Loop, también en la sección Spawning). Controla si el modo Animate repite el ciclo de forma continua o reproduce un ciclo y se detiene. Transform establece AnimateLoop = false de forma predeterminada, lo que significa que la fuente reproduce un ciclo y se detiene. Para el comportamiento Animate continuo (el uso típico), activa el interruptor en el panel; el ciclo se repetirá entonces mientras Enabled esté activado.

Cada iteración del bucle vuelve a leer la configuración de link de la fuente (Link, LinkMode, LinkSource, Link Dir.), por lo que las ediciones en vivo de esos campos durante un bucle Animate activo surten efecto en el siguiente ciclo sin necesidad de ciclar Enabled. Y un bucle Animate que estaba en ejecución cuando cerraste Studio se reanuda automáticamente la próxima vez que se cargue el lugar con el plugin instalado — no tienes que rearmarlo manualmente.

Un tipo tiene un comportamiento predeterminado diferente al resto: Atmosphere. Roblox renderiza solo un Atmosphere por Lighting a la vez, por lo que múltiples Atmospheres clonados competirían por el único slot de renderizado y producirían parpadeo. El Transform del plugin establece EmissionMode = "Animate" en los Atmospheres específicamente, en lugar de "Emit" como en todos los demás tipos — de modo que el comportamiento predeterminado sea el que Roblox puede renderizar correctamente.

El plugin no impone esto en tiempo de ejecución. El desplegable es editable; cambiar Atmosphere a Emit después es mecánicamente válido, pero produce el problema de parpadeo. El valor predeterminado es la protección; trata el desplegable como algo que no debes tocar específicamente en Atmosphere.

Veremos Atmosphere y los otros diez tipos en el capítulo 8 (el Particiliary).

Hasta ahora, todos los emisores de los que hemos hablado se han quedado donde los colocaste. Pero, ¿qué pasa si tu emisor debe seguir a algo? Chispas en la punta de una espada en movimiento. Humo siguiendo a un cohete en marcha. Un resplandor que flota alrededor de la mano de un personaje mientras lanza un hechizo. El plugin tiene una forma de vincular la salida de un emisor a otra instancia, de modo que viaje con esa instancia por el espacio. Eso es el linking, y es el próximo capítulo.