Ir al contenido

Generación de partículas

Usado por: Rate, Lifetime, EmitCount, EmitDelay y EmitDuration se aplican a casi todos los tipos (Trail no tiene Rate). Las propiedades de generación espacial — SpreadAngle, Direction, Position, Pos. Mode, Orientation, Z-Offset — solo se aplican a Part, Attachment, Model. Los demás tipos usan superficies de generación más simples, descritas en sus capítulos por tipo.

Cada emisor debe responder cuatro preguntas sobre cada partícula que produce:

  1. ¿Cuándo aparece esta partícula?
  2. ¿Dónde aparece, en el espacio?
  3. ¿En qué dirección se dirige?
  4. ¿Cuánto tiempo vive?

Las propiedades de esta página responden esas cuatro preguntas. Todo en este capítulo se aplica de la misma manera a un emisor Part, un emisor Attachment y un emisor Model. Léelo una vez; los capítulos por tipo hacen referencia a él.

Etiqueta del panelAtributo de datosTipoValor predeterminadoQué hace
RateRatenumber10Partículas emitidas por segundo cuando Enabled está activo
LifetimeLifetimeNumberRange1Segundos que vive cada partícula, con variación aleatoria
SpreadAngleSpreadAngleVector2(0, 0)Cono de desviación aleatoria en grados, X e Y
DirectionEmissionDirectionenumTopQué cara de la pieza sale volando las partículas
PositionPosX, PosY, PosZtres NumberRange0Desplazamiento aleatorio desde el centro del emisor al generarse
Pos. ModePosModeenumLocalEn qué marco se calculan los desplazamientos de posición
OrientationOrientationenumNoneCómo las partículas miran hacia la cámara o hacia su propia velocidad
Z-OffsetZOffsetnumber0Sesgo constante de profundidad de renderizado para efectos de capas
EmitCountEmitCountnumber0Cantidad de ráfaga única, independiente de la tasa continua
EmitDelayEmitDelaynumber0Segundos de espera después de que Enabled se active, antes de la primera partícula
EmitDurationEmitDurationnumber0Segundos de bucle continuo tras las ráfagas iniciales. 0 omite el bucle

La más sencilla de todas. Rate es el número de partículas que el emisor genera por segundo cuando Enabled es true.

Un Rate de 10 es una partícula cada décima de segundo. Un Rate de 100 es un flujo denso — diez veces más denso. Un Rate de 0.5 es una partícula cada dos segundos: un goteo lento y deliberado.

El plugin no impone un máximo. El coste es el que es — cada partícula pasa por el nacimiento de cinco pasos del capítulo 6, y con tasas altas, se nota. Una sola explosión grande construida con un Rate de 2000 es espectacular pero costosa. Un campo de motas mágicas con Rate 5 por emisor, distribuidas entre veinte emisores, a menudo se ve mejor y consume menos recursos.

Cuando Enabled se desactiva, la emisión se detiene. Las partículas ya en vuelo no se ven afectadas — viven el resto de su Lifetime y desaparecen.

Cuánto tiempo, en segundos, vive cada partícula.

Es un NumberRange en lugar de un número único, lo que significa que cada partícula elige una duración de vida aleatoria dentro del rango en el momento en que se emite. Un Lifetime de 0.5,1.5 significa que cada partícula vive entre medio segundo y un segundo y medio. Dos partículas generadas en el mismo instante pueden morir en momentos distintos.

La variación importa más de lo que parece. Un campo de partículas que mueren exactamente al mismo tiempo parece mecánico; el mismo campo con duraciones de vida aleatorias se siente orgánico. Establecer Lifetime como un número único (1.0) colapsa el rango — cada partícula obtiene exactamente esa duración de vida — lo cual en ocasiones es lo que se busca (un destello con temporización precisa), pero generalmente es demasiado uniforme.

El formato de entrada del plugin acepta un valor único ("1.5") como un rango con ambos extremos iguales, o pares min,max ("0.5,1.5").

Trail es diferente. En los emisores Trail, Lifetime es un número único (sin rango), con valor predeterminado 2. Trail emite una estela en lugar de partículas discretas, por lo que la variación aleatoria por partícula que proporciona un rango no se aplica. El capítulo de Trail lo cubre cuando lleguemos ahí.

Qué tan ancho es el cono por el que salen las partículas, en grados.

Un SpreadAngle de (0, 0) significa que cada partícula se lanza exactamente en la dirección de emisión — un rayo estrecho. Un SpreadAngle de (45, 45) da a cada partícula una desviación aleatoria de hasta 45° desde el centro, en ambos ejes X e Y — un cono amplio, como el haz de una linterna.

Los dos componentes son independientes. (45, 0) crea un abanico: dispersión en X, sin dispersión en Y. Útil para efectos tipo cinta que deben barrer horizontalmente pero mantenerse apretados verticalmente. (180, 180) es completamente omnidireccional — las partículas salen en todas direcciones, como una explosión de polen.

Etiqueta de UI: Direction. Atributo de datos: EmissionDirection.

Qué cara del emisor atraviesan las partículas al generarse. Un valor enum tomado del NormalId de Roblox: Top, Bottom, Front, Back, Left, Right.

Una hoguera que genera chispas debería usar Top. El escape de un reactor debería usar Back. Una rejilla de suelo que deja escapar vapor hacia arriba debería usar Top. El valor predeterminado es Top.

Direction solo establece la dirección inicial. La dispersión y los gráficos de movimiento toman el control desde ahí. Una partícula lanzada desde Top con un gráfico de Speed que incluye valores negativos puede terminar regresando hacia abajo a través de la pieza — la dirección de lanzamiento es el punto de partida, no una restricción.

Etiqueta de UI: Position (una fila con entradas de eje X/Y/Z). Atributos de datos: PosX, PosY, PosZ.

Tres valores NumberRange que desplazan la posición de generación desde el centro del emisor. Cada partícula elige un valor aleatorio dentro del rango de cada eje y comienza en ese desplazamiento.

Un PosX de 0,2 significa que la posición X de cada partícula está entre 0 y 2 studs desde el centro del emisor. Combinado con PosY = 0,2 y PosZ = 0,2, las partículas se generan en cualquier lugar dentro de un cubo de 2×2×2 relativo al emisor — una pequeña región en lugar de un punto único.

Esto es lo que hace que una fuente parezca una fuente en lugar de un láser. Las partículas no pueden salir todas del mismo punto exacto si se quiere que parezcan naturales. Incluso pequeños desplazamientos — 0,0.5 en cada eje — rompen el aspecto de fuente uniforme y hacen que la emisión se sienta real.

Si se desea una fuente de punto único (un efecto delgado similar a un láser), establece los tres en 0,0. El valor predeterminado es exactamente ese.

Etiqueta de UI: Pos. Mode. Atributo de datos: PosMode.

PosMode es a Position lo que DirMode es a EmissionDirection — le indica al motor en qué marco se aplican los desplazamientos de posición. Los valores de desplazamiento en sí (PosX, PosY, PosZ) solo describen distancias; PosMode decide a lo largo de qué ejes se aplican esas distancias.

Un enum: Local, Global o RigidLocal.

Los desplazamientos se aplican en el marco local de la pieza. La región de generación rota y se traslada con la pieza a medida que esta rota y se traslada. Una antorcha sostenida por un personaje con PosX = 0,1 siempre se desplaza a lo largo de la “derecha” de la antorcha — en la dirección que mire el personaje — porque la X local de la antorcha rota con el personaje.

Casos de uso:

  • Región de generación unida a un emisor en movimiento. Brasas mágicas flotando alrededor de la punta de una varita — las brasas se agrupan alrededor de la varita dondequiera que esté, en el marco de coordenadas de la varita.
  • Generación por cara que rota con la fuente. Chispas que salen de las cuatro caras de un cubo — establece PosX = (-1, 1), PosY = 0, PosZ = 0 en un emisor con forma de caja, y la banda de generación corre a lo largo del eje X local del cubo, barriendo al rotar.
  • Cualquier caso donde la forma de generación “pertenece” al emisor. La mayoría de los trabajos de autoría terminan aquí — Local es el valor predeterminado correcto.

Los desplazamientos se aplican en el espacio del mundo, ignorando completamente la rotación de la pieza. La región de generación permanece alineada con los ejes X/Y/Z del mundo independientemente de lo que haga la pieza.

Casos de uso:

  • Fuente en un barco en movimiento. El barco se inclina; la región de generación de la fuente (y por lo tanto su forma visual) no se inclina con él.
  • Nevada sobre un área en movimiento. Una región de generación plana y amplia que siempre debe estar horizontalmente sobre el mundo, aunque el emisor fuente esté rotado por razones no relacionadas (como al animar con un tween).
  • Emisores rotados proceduralmente que no deben arrastrar su región de generación. Cualquier caso donde un script rota el emisor por razones de diseño, pero se quiere que las posiciones reales de las partículas permanezcan alineadas con el mundo.

Un híbrido. El desplazamiento se muestrea en el marco local de la pieza en el momento de la generación, luego se fija en el espacio del mundo — las rotaciones posteriores de la pieza no redirigen las partículas ya emitidas. El cono de generación sigue la rotación de la pieza, pero cada partícula individual, una vez generada, deja de rastrear la pieza.

Casos de uso:

  • Efectos de “lluvia” desde una fuente en movimiento. Un personaje corriendo bajo la lluvia; las gotas se generan alrededor del personaje (región de generación estilo Local), pero una vez generadas, derivan por sí solas sin reorientarse si el personaje gira.
  • Ráfagas únicas desde un objeto en rotación. Un molinete giratorio que dispara una sola ráfaga — la posición de generación de cada chispa se congela en el espacio del mundo en el momento del disparo, por lo que la rotación posterior del molinete no arrastra las chispas ya generadas.
  • Cualquier caso donde se quiera una forma de generación bien controlada pero trayectorias de partículas individuales estables en el mundo.

PosMode y DirMode son independientes — elige cada uno según sus propios méritos. Las cuatro combinaciones más comunes:

  • PosMode = Local + DirMode = RigidLocal. Tanto la posición de generación como la dirección siguen la rotación del emisor. El valor predeterminado para la mayoría de los efectos “unidos a algo en movimiento” (antorcha, espada, vehículo).
  • PosMode = Local + DirMode = Global. La región de generación rota con el emisor, pero las partículas siempre vuelan en direcciones del mundo. Un aspersor giratorio donde las gotas siempre caen hacia abajo independientemente de cómo apunte la cabeza.
  • PosMode = Global + DirMode = RigidLocal. La región de generación está alineada con el mundo (un plano plano), pero las partículas vuelan en la dirección local del emisor. Útil para efectos de plano de emisión en una fuente inclinada.
  • PosMode = Global + DirMode = Global. Todo está alineado con el mundo. El emisor es solo un marcador de posición; su rotación se ignora por completo.

Cómo se rota cada partícula en relación con la cámara o con su propia velocidad. El mismo enum que usa ParticleEmitter.Orientation de Roblox: None, FacingCamera, FacingCameraWorldUp, VelocityParallel, VelocityPerpendicular.

Esta es la propiedad que decide si una partícula Part se lee como un objeto 3D rodando por el espacio, un sprite 2D que siempre mira al espectador, o una estela de movimiento alineada con su trayectoria. Elegir el modo correcto tiene más que ver con la intención visual que con la corrección — cada modo es útil para algún efecto y confuso para otros.

Sin orientación automática. La partícula usa la rotación con la que fue emitida — la rotación inicial aleatoria de los rangos RotX/Y/Z, modificada cada fotograma por los gráficos RotSpeedX/Y/Z de Motion. La posición de la cámara y la velocidad de la partícula no tienen influencia.

Casos de uso:

  • Partículas de malla 3D que deben rodar por el espacio — un fragmento de vidrio, una moneda, una hoja. El punto central de estas es que se lean como objetos 3D con su propia rotación; se quiere que giren sobre sus propios ejes, indiferentes a la cámara.
  • Orientaciones congeladas bloqueadas a la pantalla — un sigilo mágico dibujado en un ángulo específico que debe permanecer en ese ángulo, sin reorientarse nunca según el espectador.

Cada fotograma, la partícula se rota para que su cara apunte hacia la cámara. La partícula se lee como un sprite 2D que siempre parece plano al espectador — exactamente como lucen por defecto las partículas del ParticleEmitter estándar de Roblox.

Casos de uso:

  • Chispas, brillos, destellos. Cualquier cosa que conceptualmente sea un sprite plano — explosiones, destellos de boca de arma, brillos mágicos — debe mirar hacia la cámara para que la textura sea siempre completamente visible.
  • Indicadores estilo UI en 3D. Números de daño, popups de recogida “+1”, retículas de objetivo dibujadas como partículas Part en el espacio del mundo, pero siempre orientadas hacia la cámara para mayor legibilidad.
  • Destellos estilo lens flare. Texturas de rayos de estrella unidas a objetos brillantes que siempre deben leerse como un destello independientemente del ángulo de la cámara.

Como FacingCamera, pero el eje “arriba” de la partícula está bloqueado a la dirección arriba del mundo en lugar de la de la cámara. La partícula sigue mirando hacia la cámara, pero no gira alrededor del eje de la cámara cuando esta se inclina.

Casos de uso:

  • Columnas de humo / pilares de polvo. Una columna de humo siempre debe estar vertical independientemente de la inclinación de la cámara; el FacingCamera puro permitiría que girara al rotar la cámara. FacingCameraWorldUp mantiene la columna vertical.
  • Pancartas o etiquetas flotantes. Texto o iconos en el espacio 3D que deben permanecer legibles (con el lado correcto hacia arriba) aunque el jugador incline la cámara.
  • Cualquier cosa donde “arriba” tiene significado semántico. Lluvia cayendo, nieve a la deriva, rayos de energía apuntando hacia arriba — FacingCamera les permitiría girar alrededor del eje de la cámara. FacingCameraWorldUp mantiene la dirección arriba bloqueada al arriba del mundo.

La partícula alinea su eje hacia adelante con su dirección de velocidad actual — su “frente” apunta hacia donde se dirige, fotograma a fotograma. Una chispa emitida hacia arriba y luego desviada lateralmente por la aceleración siempre apunta en su dirección de movimiento actual.

Casos de uso:

  • Efectos tipo estela. Balas trazadoras, colas de cometas, estrellas fugaces, rayos — cualquier cosa que deba verse como algo moviéndose rápido con una forma estirada a lo largo del movimiento.
  • Efectos de líneas de velocidad. Líneas de desenfoque de movimiento estilo anime que irradian hacia afuera — cada una alineada con el movimiento de su partícula individual.
  • Lluvia cayendo. Cada gota de lluvia orientada a lo largo de su propio vector de velocidad se lee como cayendo, incluso cuando el viento la redirige lateralmente.
  • Partículas con una textura de “frente”. Flechas, peces, misiles — cualquier elemento cuyo visual tenga una dirección obvia. Combinar con una Part con forma de flecha o una estela delgada.

La partícula se alinea perpendicular a su dirección de movimiento. El lado plano de la partícula queda orientado a lo largo de su trayectoria.

Casos de uso:

  • Cintas barriendo por el aire. Un plano plano que sigue su trayectoria, mostrando su lado ancho al moverse. La forma permanece de canto hacia la velocidad en lugar de de frente.
  • Desenfoque de movimiento cinematográfico. Rectángulos largos y delgados orientados perpendicular al movimiento se leen como líneas de difuminado — útiles para visuales de acción a alta velocidad.
  • Estelas tipo ala. Un par de emisores Part a ambos lados de un objeto en movimiento, orientados perpendicularmente al movimiento, produce cintas tipo ala que se extienden detrás de la fuente.
  • Partículas donde tiene sentido que el visual “se extienda lateralmente”. Una bandera ondeando en el aire, un trozo de tela atrapado en el viento — la orientación perpendicular se lee como la superficie plana atrapando el flujo aparente.

Etiqueta de UI: Z-Offset. Atributo de datos: ZOffset.

Un sesgo constante añadido a la profundidad de renderizado de la partícula — su distancia a la cámara en lo que respecta al renderizador, no su distancia física.

Los valores positivos acercan las partículas hacia adelante (renderizadas más cerca de la cámara, encima de otras cosas). Los valores negativos las empujan hacia atrás.

ZOffset sirve para resolver disputas de capas entre efectos. Un efecto de destello que siempre debe renderizarse frente a un efecto de humo puede usar un ZOffset positivo mientras el humo usa cero. Los dos efectos pueden ocupar el mismo espacio físico y aun así respetar un orden de capas claro.

El valor predeterminado es 0. La mayoría de los emisores nunca necesitan cambiarlo.

EmitCount, EmitDelay, EmitDuration — tres campos solo de atributos

Sección titulada «EmitCount, EmitDelay, EmitDuration — tres campos solo de atributos»

Una nota antes de las próximas tres secciones: estas tres propiedades se almacenan como atributos a nivel de elemento, no como filas editables en el panel de propiedades. El pipeline de emisión del plugin los lee desde la instancia fuente mediante instance:GetAttribute("EmitCount") (y los demás), pero no los expone como entradas del panel. Para editarlos, abre la ventana Properties integrada de Studio, desplázate hasta la sección Attributes cerca de la parte inferior y edita los valores allí.

Transform establece valores predeterminados al transformar un elemento (para que los atributos estén presentes desde el inicio), y la herramienta de portapapeles del plugin los agrupa bajo una sección “Emission” para copiar y pegar. Pero la edición ocurre en el panel Attributes de Studio, no en el panel de propiedades del plugin.

Cuántas partículas se disparan como las ráfagas iniciales de un evento de disparo — el botón Emit de Studio, :EnableEmit desde un script, o :AbsoluteEmit en un elemento transformado. Cada ráfaga es una llamada al emit por tipo (una partícula para Part / Attachment / Beam, un clon para los tipos de pantalla / imagen / luz), y EmitCount de ellas salen antes de que el bucle continuo opcional (impulsado por EmitDuration) comience.

EmitCount no afecta la emisión continua controlada por Rate que se obtiene al activar el toggle Enabled. Esa ruta usa Rate exclusivamente.

La mayoría de los trabajos de autoría usan Rate mientras Enabled está activo e ignoran EmitCount. Recurre a él al crear un efecto único y desencadenado — un golpe de espada, un hechizo lanzado — donde el momento es impulsado por eventos en lugar de ser ambiental.

Segundos de espera al inicio de un evento de disparo, antes de que salga la primera ráfaga. Al igual que EmitCount y EmitDuration, esto se aplica solo a la ruta de disparo (botón Emit / :EnableEmit / :AbsoluteEmit) — no al flujo continuo del toggle Enabled.

Útil para escalonar emisores que deben dispararse en secuencia. Un efecto de varita con tres emisores encadenados — cabeza, medio, cola — puede tener cada uno un EmitDelay diferente para que el visual se lea como una ola en lugar de un destello simultáneo.

EmitDelay solo afecta el inicio del evento de disparo. Una vez que las ráfagas han salido y el bucle continuo (si EmitDuration > 0) está en marcha, Rate toma el control.

Segundos de emisión continua después de que se hayan disparado las ráfagas iniciales de EmitCount. Una vez transcurridos esos segundos, la emisión se detiene por sí sola.

Esto se aplica a la ruta de “disparo” — el botón Emit de Studio, la llamada en tiempo de ejecución :EnableEmit, y :AbsoluteEmit en un elemento transformado. El plugin lee EmitDuration en el momento del disparo, ejecuta el bucle continuo durante esos segundos y luego se detiene. Las partículas ya en vuelo completan su vida útil; no se generan nuevas.

Un valor de 0 (el predeterminado) significa sin bucle continuo — solo se disparan las ráfagas iniciales de EmitCount, luego el emisor permanece en silencio hasta el siguiente disparo. Un valor de 2 significa: disparar las ráfagas, luego ejecutar en bucle continuo durante dos segundos y detenerse.

EmitDuration sirve para declarar el tiempo de ejecución de un efecto único. Una animación de lanzamiento que debe durar exactamente 1,5 segundos establece EmitDuration = 1.5 y confía en que el plugin se detenga por sí solo.

La otra ruta de emisión — activar el toggle Enabled en el panel de propiedades (o config:SetAttribute("Enabled", true) mediante script) — no está limitada por EmitDuration. Esa ruta ejecuta el bucle continuo hasta que se desactiva Enabled de nuevo. Usa Enabled para fuentes y efectos ambientales que deben ejecutarse mientras exista el emisor; usa EmitDuration (con el botón Emit o :EnableEmit) para efectos con script que tienen una duración de ejecución específica.

Trail es diferente. En los emisores Trail, EmitDuration es un string — ya sea un número único ("2") o un rango min/max separado por comas ("5,2") del que el plugin elige una duración aleatoria por emisión. El capítulo de Trail cubre el formato de string cuando lleguemos ahí.

El cuándo, el dónde y el en qué dirección de la generación están cubiertos. La siguiente pregunta es cómo se mueve la partícula una vez lanzada: qué tan rápido, en qué dirección, con qué aceleración o arrastre. Ese es el capítulo de Motion.