El emisor no emite
Has configurado un emisor. Activaste Enabled. No ocurre nada visible. O llamas :Emit() desde un script y no aparecen partículas.
Este capítulo es la lista de verificación. Las causas están ordenadas por la frecuencia con que cada una resulta ser el problema real — empieza por arriba y ve bajando.
1. ¿Enabled está realmente activado?
Sección titulada «1. ¿Enabled está realmente activado?»La primera y más común causa. El interruptor Enabled en el panel de propiedades debe ser true para la emisión continua. Después de Transform, el plugin lo establece en false por defecto; tienes que activarlo manualmente.
Para la emisión controlada por script, el comportamiento depende del método utilizado:
:Emit(item)— disparo único. No leeEnabled.:EnableEmit(item)— ejecuta los disparos instantáneos deEmitCountdel elemento y, siEmitDuration > 0, establece elEnabled = truede la Configuration, ejecuta el bucle continuo durante esa cantidad de segundos y vuelve a ponerEnabledenfalsecuando la ventana se cierra. ConEmitDuration = 0, no se ejecuta ningún bucle continuo yEnablednunca se toca.:Enable(item)— ejecuta un bucle continuo que compruebaEnableden cada fotograma. Si esfalse(el valor predeterminado recién transformado), el bucle sale en su primera iteración. Establece elEnabled = truede la Configuration antes de llamarlo, o llama a:EnableEmiten su lugar.
Para la vista previa del plugin en Studio (la emisión en vivo mientras construyes el efecto), Enabled es el interruptor principal.
2. ¿Llamaste :Activate() en tu script?
Sección titulada «2. ¿Llamaste :Activate() en tu script?»Para juegos en tiempo de ejecución que usan la API From Script, llamar a :Emit o :EnableEmit sin haber llamado primero a :Activate() no produce partículas visibles. Los métodos no dan error — simplemente no se ejecutan, porque el bucle Heartbeat del motor no está conectado.
local Part_Icles = require(game.ReplicatedStorage:WaitForChild("Part_Icles"))Part_Icles:Activate() -- ← required before any emit callsPart_Icles:Emit(item)En Studio, el plugin se ejecuta por defecto en cada inicio de Studio — no se necesita activación manual para la vista previa en vivo. En un juego publicado, tu script debe llamar a :Activate() manualmente. Consulta Instalar y requerir.
3. Para emisores de Model: ¿el Model tiene un PrimaryPart?
Sección titulada «3. Para emisores de Model: ¿el Model tiene un PrimaryPart?»Transform se niega a aplicarse si un Model no tiene configurado un PrimaryPart. El pipeline de emisión del plugin usa Model:PivotTo() y Model:ScaleTo(), ambos necesitan el PrimaryPart como ancla de pivote.
Si hiciste clic en Transform sobre un Model y nada cambió, revisa la consola Output de Studio en busca de una advertencia. Establece el PrimaryPart en el Model desde el Explorer de Studio (clic derecho en la Part hija correspondiente → “Set as Primary Part”), y luego haz clic en Transform nuevamente.
4. Para emisores de Beam: ¿están configurados Attachment0 y Attachment1?
Sección titulada «4. Para emisores de Beam: ¿están configurados Attachment0 y Attachment1?»La clase Beam de Roblox necesita ambos extremos de attachment para renderizar algo. Si alguno es nil o apunta a una instancia destruida, el Beam no dibuja nada. El plugin no valida esto por ti — hereda lo que tenga el Beam de origen.
Verifica las propiedades Attachment0 y Attachment1 del Beam de origen en Studio. Ambas deben referenciar instancias Attachment válidas. Si alguna está vacía, arrastra el Attachment correspondiente al campo de la propiedad.
Esta es la causa habitual de “emití un Beam y obtuve un disparo invisible — el motor emitió pero no se renderizó nada.”
5. Para emisores de nivel superior Part / Attachment / Model / PointLight disparados desde un script: ¿están configurados los atributos de temporización?
Sección titulada «5. Para emisores de nivel superior Part / Attachment / Model / PointLight disparados desde un script: ¿están configurados los atributos de temporización?»Los emisores de Part, Attachment, Model y PointLight tienen por defecto EmitCount = 0 y EmitDuration = 0 al hacer Transform — esperan que el usuario establezca la temporización explícitamente o confíe en el auto-bump para disparadores de un solo uso.
Llamar a :EnableEmit en un elemento con valores cero por defecto sigue produciendo emisión a través del auto-bump: cuando tanto EmitCount como EmitDuration leen cero, :EnableEmit trata la llamada como “disparar una vez” y ejecuta un único disparo. El mismo auto-bump se ejecuta para los emisores anidados dentro del ciclo de emisión de cualquier tipo padre, por lo que los rigs anidados funcionan sin necesidad de configurar la temporización por emisor.
Si deseas emisión continua, establece EmitCount (disparos iniciales) y/o EmitDuration (segundos de bucle continuo después) con valores distintos de cero mediante el panel de Attributes, y luego llama a :EnableEmit. Alternativamente, llama a :Enable(item, link, duration) directamente — ese método ignora completamente EmitCount y EmitDuration y ejecuta en bucle :Emit al Rate del elemento hasta que duration transcurra o Enabled se desactive. (:Enable requiere que el atributo Enabled de la Configuration sea true; los elementos recién transformados tienen Enabled = false. El punto 1 anterior explica la solución.)
Beam no tiene este problema: Transform establece EmitCount = 1 en los Beams específicamente. Trail tampoco, pero por una razón diferente — usa un EmitDuration de tipo string que por defecto es "2" y se parsea en el momento del disparo.
6. Para emisores de Attachment: ¿está poblado el Render Template?
Sección titulada «6. Para emisores de Attachment: ¿está poblado el Render Template?»Cuando transformas un Attachment, el plugin crea un hijo RenderTemplate como un clon del propio Attachment. Por sí solo, ese clon no dibuja nada — los Attachments no se renderizan de forma nativa en Roblox. Debes añadir una instancia hija (un Decal, un Beam, un Trail, un PointLight, un BillboardGui — cualquier cosa visible) dentro del RenderTemplate para que las partículas-Attachment emitidas tengan un aspecto visual.
Abre el Attachment en el Explorer de Studio, encuentra el hijo RenderTemplate y añade un Decal (o el visual que mejor se adapte al efecto). Cada partícula emitida llevará entonces ese hijo como componente visible.
Se explica en detalle en el capítulo de Attachment.
7. Para emisores de Trail: ¿se están moviendo los attachments?
Sección titulada «7. Para emisores de Trail: ¿se están moviendo los attachments?»Un Trail dibuja una estela entre dos attachments. Si los attachments no se mueven (el Trail de origen y su padre están estáticos), el Trail no dibuja ninguna estela visible — no hay trayectoria que dibujar.
Mueve los attachments — ya sea parentándolos a un objeto en movimiento (una espada, un vehículo), o interpolando sus posiciones en un script. El Trail entonces dejará su estela visible a lo largo del camino que recorran los attachments.
Si deseas un efecto similar a un Trail en un emisor que no se mueve, ese es el tipo incorrecto — usa un emisor de Beam o de Part en su lugar.
8. Para Atmosphere: ¿es EmissionMode = "Animate"?
Sección titulada «8. Para Atmosphere: ¿es EmissionMode = "Animate"?»El tipo Atmosphere tiene por defecto el modo Animate al hacer Transform — el plugin lo establece así específicamente porque Roblox renderiza solo un Atmosphere a la vez, y el modo Animate mantiene esa restricción satisfecha. El plugin no fuerza al desplegable a permanecer en Animate; el usuario puede cambiarlo. Si has cambiado el desplegable a "Emit" después del Transform, el plugin producirá múltiples clones de Atmosphere — y Roblox renderiza solo uno a la vez, por lo que el visual parpadea entre clones o simplemente no se muestra.
Cambia EmissionMode de vuelta a "Animate" para Atmosphere. Consulta el capítulo de Atmosphere para el razonamiento completo.
9. ¿Es válido el asset id de la textura?
Sección titulada «9. ¿Es válido el asset id de la textura?»Para emisores de Part, Beam, Trail e ImageLabel con un asset id de Texture (o Image), un id inválido renderiza la partícula sin textura (un color sólido plano, según el valor predeterminado del tipo). El emisor sigue emitiendo — simplemente no se muestra ninguna imagen.
Causas comunes:
- Error tipográfico en el asset id (
rbxassetid://1234en lugar derbxassetid://123456789). - Asset moderado o eliminado por Roblox.
- Asset subido a una cuenta diferente que no es la tuya.
Abre el asset id en un navegador (https://www.roblox.com/library/<id>) para verificar que carga. Si falta o está moderado, reemplázalo.
10. Para ImageLabel: ¿está configurado Image?
Sección titulada «10. Para ImageLabel: ¿está configurado Image?»ImageLabel tiene por defecto Image = "" (vacío). Una Image vacía renderiza la partícula como un rectángulo BackgroundColor3 sólido — generalmente el fondo transparente por defecto, por lo que no se ve absolutamente nada.
Establece la propiedad Image en el panel con un asset id válido. Las partículas mostrarán entonces la textura configurada.
11. Para PointLight: ¿el Enabled = false del origen?
Sección titulada «11. Para PointLight: ¿el Enabled = false del origen?»El plugin establece el Enabled = false del PointLight de origen después del Transform, para que no se renderice mientras estás creando el efecto. Cada duplicado de PointLight emitido es una instancia nueva con su propio estado, y el plugin se encarga de activarlos.
Si tu PointLight de origen desapareció inesperadamente, es por eso — no ha desaparecido, solo está desactivado. Puedes reactivarlo manualmente para pruebas, pero el plugin lo volverá a desactivar en el siguiente guardado/carga.
12. ¿Apuntaste Emit Into al lugar equivocado?
Sección titulada «12. ¿Apuntaste Emit Into al lugar equivocado?»La propiedad Emit Into (atributo de datos: EmitParent) controla dónde se parentan las partículas emitidas en la jerarquía. Por defecto (vacío), van a un valor predeterminado sensato según el tipo:
- Para tipos de workspace (Part, Attachment, Model, PointLight): el padre del origen.
- Para tipos de espacio de pantalla (Blur, Bloom, ColorCorrection, Atmosphere):
Lighting. - Para ImageLabel: un
ScreenGuigestionado enCoreGui.
Si has configurado Emit Into para apuntar a algún lugar inusual — un Folder que ha sido destruido, un padre que no acepta el tipo emitido — las partículas se spawnean en un lugar sin utilidad.
Para Atmosphere, ColorCorrection, Bloom y Blur, el padre debe ser Lighting (o un hijo de Lighting) para que el post-proceso se renderice. Establecer Emit Into en otro lugar desactiva efectivamente esos tipos.
13. ¿Muestra el panel de propiedades los valores correctos?
Sección titulada «13. ¿Muestra el panel de propiedades los valores correctos?»Un caso sutil. El panel muestra los valores de la selección actual, capturados en el momento de la selección. Si un script (u otra herramienta) escribió en los atributos del mismo elemento después de que lo seleccionaste, el panel podría mostrar números desactualizados mientras el motor lee los nuevos.
Haz clic fuera y vuelve a seleccionar el elemento para actualizar el panel. El siguiente ciclo de emisión usa los valores que realmente están almacenados en el elemento.
14. ¿Se está ejecutando realmente tu script?
Sección titulada «14. ¿Se está ejecutando realmente tu script?»Vale la pena descartarlo. Tu llamada a :Emit puede no estar ejecutándose en absoluto debido a un error en algún punto anterior:
local Part_Icles = require(game.ReplicatedStorage:WaitForChild("Part_Icles"))Part_Icles:Activate()print("Activated.") -- check Output for this line
someEvent:Connect(function() print("Event triggered.") -- check Output here too Part_Icles:Emit(item)end)Si los prints no aparecen en Output, tu script tiene un error antes de llegar a la llamada de emisión. Si aparecen y la emisión sigue sin funcionar, has llegado a la lista real de esta guía de verificación.
15. Plugin aún en beta — ¿está implementada la función?
Sección titulada «15. Plugin aún en beta — ¿está implementada la función?»Algunas funciones están en el panel de propiedades pero están enumeradas como “aún no implementadas” en el código fuente. Si has configurado una función que visiblemente no hace nada, consulta el capítulo del tipo correspondiente para ver notas de “implementado pero provisional”. (Las versiones anteriores tenían FlipbookMode = "Random" en ImageLabel cayendo hacia Loop; las versiones actuales eligen un fotograma aleatorio nuevo en cada intervalo 1 / FlipbookFramerate por partícula, por lo que esta advertencia ya no aplica.)
¿Sigues atascado?
Sección titulada «¿Sigues atascado?»Si has recorrido la lista de verificación y tu emisor sigue sin producir partículas, el problema probablemente es un caso límite específico que vale la pena plantear en los issues de GitHub o en el Discord del plugin. Captura:
- El tipo de emisor y el estado completo de su panel de propiedades.
- La consola Output de Studio (cualquier advertencia o error después de Transform / Emit).
- Si el emisor funciona con valores predeterminados cuando vuelves a hacer Transform en una instancia nueva.
La mayoría de los problemas se diagnostican recorriendo la lista de verificación anterior. Los casos restantes suelen ser bugs específicos que vale la pena reportar.