Primeros Pasos
Tres pasos para tu primera emisión en tiempo de ejecución:
- Encontrar el módulo.
- Requerirlo.
- Activar el motor y emitir.
Este capítulo cubre cada uno. Los métodos de ciclo de vida detallados (:Activate, :Deactivate, :GetFolder) están documentados en el capítulo Lifecycle.
Dónde se coloca el módulo
Sección titulada «Dónde se coloca el módulo»El plugin mantiene el módulo de ejecución interno hasta que le indiques que deposite una copia en tu lugar. Hay dos formas de obtenerla:
Opción A — Insert Module (workspace). Abre el QMenu del plugin, haz clic en Insert Module. El plugin destruye cualquier workspace.Part_Icles existente y clona una copia nueva en:
workspace└── Part_Icles (ModuleScript)Opción B — abrir el panel Emit Code (ReplicatedStorage). La primera vez que abres la herramienta Emit Code, el plugin clona una copia nueva en ReplicatedStorage (la convención utilizada por los fragmentos de código que genera esa herramienta):
ReplicatedStorage└── Part_Icles (ModuleScript)Cualquiera de las dos copias funciona en tiempo de ejecución. La elección es simplemente dónde pertenece el módulo en tu jerarquía: workspace agrupa el módulo con una escena específica, ReplicatedStorage sigue la convención estándar de Roblox y es lo que los fragmentos autogenerados por Emit Code usan con require.
Ambos flujos son idempotentes — volver a ejecutarlos tras una actualización automática del plugin refresca la copia existente a la versión actual en lugar de duplicarla. El plugin también refresca automáticamente cualquier copia existente al iniciar Studio, por lo que un módulo desactualizado de una versión anterior se actualizará silenciosamente la próxima vez que abras el lugar.
El módulo se guarda con el archivo de tu lugar, así que cuando el juego se publique, el runtime viajará con él. Los jugadores no necesitan tener ningún plugin instalado — solo el módulo que el plugin dejó atrás. Consulta el capítulo Toolbench Utilities para la descripción completa de la herramienta.
Requerir el módulo
Sección titulada «Requerir el módulo»Patrón estándar de require en Roblox. Elige la ruta que corresponda a donde está colocado el módulo en tu archivo de lugar:
-- ReplicatedStorage copy (matches Emit Code's generated snippets)local Part_Icles = require(game.ReplicatedStorage:WaitForChild("Part_Icles"))
-- Or, workspace copy (from Insert Module)local Part_Icles = require(workspace:WaitForChild("Part_Icles"))El resto de esta guía usa la forma de ReplicatedStorage porque se combina con lo que genera la herramienta Emit Code. Sustituye libremente la ruta de workspace si es donde está colocada tu copia.
:WaitForChild es importante en el lado del cliente — el módulo se replica desde el servidor cuando el jugador se une, y puede no estar presente en el momento de ejecución del script en el primer fotograma. En el servidor, el módulo está disponible inmediatamente, pero WaitForChild es inofensivo en cualquier caso.
Part_Icles es ahora una tabla Lua normal con métodos. Llámalaos con la sintaxis de dos puntos:
Part_Icles:Activate()Part_Icles:Emit(someTransformedItem)Requiérelo una vez al inicio y reutiliza la referencia en todo tu código. El módulo es un singleton — requerirlo dos veces devuelve la misma tabla.
Tu primera emisión
Sección titulada «Tu primera emisión»El script mínimo posible. Colócalo en ServerScriptService (o como LocalScript en StarterPlayerScripts para emisión en el cliente):
local Part_Icles = require(game.ReplicatedStorage:WaitForChild("Part_Icles"))Part_Icles:Activate()
local effect = workspace:WaitForChild("MyEffect")Part_Icles:AbsoluteEmit(effect)Ocurren tres cosas:
requirecarga la tabla del módulo.:Activateconecta el bucleHeartbeatdel motor y prepara el estado interno. Sin este paso las llamadas de emisión no generan errores — crean clones congelados que nunca se actualizan y se acumulan indefinidamente. Activa siempre primero.:AbsoluteEmitrecorre el subárbol bajoMyEffecty dispara cada emisor que haya en su interior — cada Part / Beam / Attachment / Model / PointLight / ImageLabel transformado y de tipo espacio de pantalla más cadaParticleEmitteryTrailnativo. Cada uno usa su propio tiempo de autoría (EmitCount,EmitDelay,EmitDuration). Una sola llamada.MyEffectpuede ser un único elemento transformado, unFoldercon muchos emisores, un rigModelcompleto, incluso el propioworkspace—:AbsoluteEmitacepta cualquier entrada.
Ese es el patrón completo. Los otros despachadores de emisión — :Emit, :EmitAnimate, :Enable, :EnableEmit, :Disable — existen para los casos en los que quieres control preciso sobre un único emisor (una ráfaga, un bucle continuo con duración explícita, cancelación en vuelo). Para la mayoría del código de juego, :AbsoluteEmit es la llamada indicada. La herramienta Emit Code del plugin genera llamadas a :AbsoluteEmit por defecto por la misma razón.
Servidor vs cliente
Sección titulada «Servidor vs cliente»Ambos funcionan. Elige según dónde quieras que sea autoritativa la emisión:
- Emisión en el servidor — el servidor llama a
:Emit, los clones de partículas resultantes se replican a todos los clientes. Consistente para todos los jugadores, pero añade coste de replicación. - Emisión en el cliente — cada cliente ejecuta su propio runtime y emite sus propias partículas. Sin coste de replicación. Patrón habitual para efectos cosméticos (chispas, destellos de bloom) donde pequeñas variaciones por cliente no importan.
Puedes usar ambos en el mismo juego. Cada runtime se activa de forma independiente — llama a :Activate una vez en el servidor (en ServerScriptService) y una vez por cliente (en el LocalScript de StarterPlayerScripts).
Qué viene después
Sección titulada «Qué viene después»Con el runtime activado y tu primera emisión disparada, el siguiente capítulo — Lifecycle — documenta :Activate, :Deactivate y :GetFolder en detalle. Luego, Emission cubre los seis métodos despachadores.