Model
Un emisor Part genera Parts. Un emisor Attachment genera Attachments. ¿Qué ocurre con una partícula que es más de una Part?
Una gema giratoria con su propio aura brillante consta de dos elementos visibles (la malla de la gema, el halo de luz). Un avión de juguete tiene decenas (fuselaje, alas, hélice, luces). Un sigilo mágico con tres anillos concéntricos son tres Parts unidas. Ninguno de esos funciona como emisión de una sola Part — son intrínsecamente compuestos.
Ese es el caso que Model gestiona. Cuando se transforma un Model, cada emisión produce un duplicado del modelo completo: la PrimaryPart, todos los descendientes, attachments, beams, meshes, scripts, todo el subárbol. El duplicado se mueve y rota como una unidad, escala como una unidad, y se crea y destruye como una unidad.
Qué transforma
Sección titulada «Qué transforma»Cualquier instancia Model de Roblox con una PrimaryPart asignada.
El plugin requiere PrimaryPart para tener un ancla determinista desde la que calcular la posición de generación del duplicado. (Los métodos Model:PivotTo() y Model:ScaleTo() de Roblox funcionarán técnicamente en un Model sin PrimaryPart — el motor recurre a la primera BasePart del Model, o al origen del mundo — pero el pivote resultante puede desplazarse si se reordenan los hijos, lo que hace inestable la colocación en la generación. La comprobación del plugin evita ese problema.) Transform bloquea la operación si falta PrimaryPart, con una advertencia. Establece la PrimaryPart en el Model de origen en el Explorador de Studio primero, y luego haz clic en Transform.
El modelo de emisión compuesta
Sección titulada «El modelo de emisión compuesta»Cuando un Model emite, el motor clona el subárbol RenderTemplate completo con Model:Clone(). Eso puede implicar muchas BaseParts, Attachments, Beams, Decals, luces — todas duplicadas juntas como una estructura con la misma geometría interna que tiene la fuente. El clon se empareja con EmitParent (o con el padre del Model si EmitParent está vacío), y luego se coloca mediante Model:PivotTo() en la posición de generación calculada a partir de las propiedades de generación habituales.
Cada fotograma después de eso, el motor actualiza la posición del duplicado Model calculando un nuevo CFrame local (impulsado por Speed, Acceleration, Drag exactamente igual que una Part) y llamando a :PivotTo() para aplicarlo. Toda la jerarquía se mueve junta — las posiciones relativas de los descendientes se conservan.
La misma llamada por fotograma se realiza para scale. El gráfico Scale del Model se muestrea en cada fotograma y se aplica mediante Model:ScaleTo(). La escala se propaga en cascada a cada descendiente de forma uniforme: cada BasePart se reduce, cada MeshPart se reduce, cada tamaño SpecialMesh se reduce, cada desplazamiento de attachment permanece colocado localmente pero a la escala menor.
Esta es la diferencia arquitectónica clave respecto a Part. Part tiene tres gráficos de eje independientes (SizeX, SizeY, SizeZ) que escalan la Part individual a lo largo de cada eje. Model tiene un único gráfico Scale uniforme, y ese único valor afecta a todo en el subárbol a la vez.
Propiedades de un vistazo
Sección titulada «Propiedades de un vistazo»La superficie completa, agrupada por sección del panel.
Spawning (compartido)
Sección titulada «Spawning (compartido)»| Etiqueta del panel | Atributo de datos | Tipo | Valor por defecto | Qué hace |
|---|---|---|---|---|
| Rate | Rate | number | 10 | Models emitidos por segundo |
| Lifetime | Lifetime | NumberRange | 1 | Segundos que vive cada Model |
| SpreadAngle | SpreadAngle | Vector2 | (0, 0) | Cono de desviación aleatoria |
| Direction | EmissionDirection | enum | Top | Por qué cara salen los Models |
| Position | PosX, PosY, PosZ | tres NumberRange | 0 | Desplazamiento aleatorio desde PrimaryPart al generarse |
| Pos. Mode | PosMode | enum | Local | Marco en el que se aplican los desplazamientos de posición |
| Orientation | Orientation | enum | None | Cómo el Model se orienta hacia la cámara o la velocidad |
| Z-Offset | ZOffset | number | 0 | Sesgo de profundidad de renderizado para capas |
| EmitCount | EmitCount | number | 0 | Cantidad de ráfaga de un solo disparo |
| EmitDelay | EmitDelay | number | 0 | Espera antes del primer Model |
| EmitDuration | EmitDuration | number | 0 | Segundos de bucle continuo tras las ráfagas iniciales. 0 omite el bucle |
Scale (específico de Model)
Sección titulada «Scale (específico de Model)»| Etiqueta del panel | Atributo de datos | Tipo | Valor por defecto | Qué hace |
|---|---|---|---|---|
| Scale | Scale | NumberSequence | 1 | Gráfico de escala uniforme aplicado en cascada a todos los descendientes |
Movement (compartido)
Sección titulada «Movement (compartido)»| Etiqueta del panel | Atributo de datos | Tipo | Valor por defecto | Qué hace |
|---|---|---|---|---|
| Speed | Speed | NumberSequence | 0 | Magnitud de velocidad a lo largo de la vida |
| Acceleration | Acceleration | Vector3 | (0,0,0) | Vector de fuerza constante cada fotograma |
| Drag | Drag | number | 0 | Decaimiento exponencial de velocidad |
| Dir. Mode | DirMode | enum | RigidLocal | Marco en el que se encuentra la dirección |
| Reverse Motion | InvertMotion | boolean | false | Reproduce la trayectoria en sentido inverso |
| Rotation | RotX, RotY, RotZ | tres NumberRange | 0 | Rotación inicial aleatoria por eje al generarse |
| Rotation Mode | RotMode | enum | OverLife | Si RotSpeed es por vida o por segundo |
| Rotation Speed | RotSpeedX, Y, Z | tres NumberSequence | 0 | Velocidad de rotación por eje |
Advanced (compartido)
Sección titulada «Advanced (compartido)»| Etiqueta del panel | Atributo de datos | Tipo | Valor por defecto | Qué hace |
|---|---|---|---|---|
| Anim. Steps | TotalKeyFrames | number | 100 | Resolución de muestreo previo para los gráficos |
| Linger | PartLife | number | 0 | Segundos que el Model permanece tras Lifetime |
| Emit Into | EmitParent | Instance | nil | Dónde se emparentan los duplicados del Model |
| Link Dir. | Link (ObjectValue) | Instance | nil | Vincula la emisión del Model a otra instancia |
| LinkSource | LinkSource | enum | None | Dónde buscar el Link |
| Link Mode | LinkMode | enum | Weld | Cómo la vinculación hereda CFrame |
Ese es el panel completo. Sin sección Appearance — los Models no tienen un gráfico unificado de Color, Transparency o Brightness. Cada instancia hija conserva su propio aspecto. Sin sección Shape — los Models no tienen una región de generación configurable (la posición de generación es la ubicación de la PrimaryPart, más los desplazamientos de Position). Sin Flipbook — los hijos con sus propias configuraciones de flipbook lo gestionan por sí mismos.
La compensación es intencional. Un Model puede contener cualquier cosa (Parts, Beams, luces, attachments, scripts, animaciones), y el plugin no puede razonablemente crear un único gráfico de Color que afecte a todos ellos de forma coherente. Cada descendiente es responsable de sus propias propiedades visuales. Si quieres que todas las Parts de un Model se desvanezcan juntas, estableces Transparency en cada Part individualmente (o usas un script hijo).
Scale, en detalle
Sección titulada «Scale, en detalle»Un gráfico NumberSequence para escala uniforme, aplicado mediante Model:ScaleTo() a toda la jerarquía del duplicado.
Scale = 1 (el valor por defecto) es sin escalado — el duplicado tiene el mismo tamaño que el Model de origen. Scale = 2 es el doble de tamaño; Scale = 0.5 es la mitad. Un gráfico que aumenta de 0.1 a 2 hace que cada duplicado Model empiece pequeño y crezca a medida que envejece — útil para efectos de “surgir de la nada” (un glifo mágico que se materializa y crece).
La escala se propaga en cascada a todos los descendientes. El Size de cada BasePart se multiplica; la malla de cada MeshPart se renderiza al tamaño escalado; el desplazamiento de cada Attachment se escala en consecuencia. El método :ScaleTo() de Roblox gestiona todo el subárbol en una sola llamada.
El plugin muestrea el gráfico Scale en cada fotograma y vuelve a aplicar :ScaleTo() con el nuevo valor. Esto puede ser costoso en Models grandes. Un Model con cincuenta descendientes requiere cincuenta actualizaciones de descendientes por fotograma por partícula activa. Con treinta duplicados activos, eso son 1.500 actualizaciones internas de propiedades por fotograma solo para el escalado. En emisores de alta frecuencia o Models detallados, esto puede afectar a la tasa de fotogramas. El plugin no omite fotogramas en los que la escala no ha cambiado, por lo que un gráfico de escala constante igualmente incurre en la llamada por fotograma.
Si no necesitas escala animada, establece el gráfico en un único keypoint (1 a lo largo) y el coste es una llamada :ScaleTo() por fotograma independientemente. El coste escala con el número de descendientes, no con cuánto cambia la escala.
Emisores anidados — el patrón de compuesto de compuestos
Sección titulada «Emisores anidados — el patrón de compuesto de compuestos»Un Model puede contener otros elementos transformados como descendientes — un Beam unido a dos Attachments dentro del Model, un PointLight emparentado con una Part hija, una Part hija que también ha sido transformada. Cuando el Model exterior emite, esos emisores anidados también emiten, automáticamente.
Concretamente: cuando se crea un duplicado Model, el motor recorre sus descendientes y comprueba cada uno en busca del atributo Transformed (la marca que Transform estampa en cada elemento que procesa). Para cada descendiente transformado, el motor borra su EmitDelay (para que no espere el retraso ya transcurrido del Model padre) y llama al mismo camino EnableEmit que un clic de nivel superior en ese descendiente produciría. El emisor anidado usa sus propias propiedades — su propio Rate, su propio Lifetime, sus propios gráficos — nada heredado del Model padre excepto la escala del padre (cubierta a continuación).
Esto produce una partícula compuesta: un duplicado Model que lleva su propio pulso Beam interno, sus propios destellos PointLight emitidos, sus propias Part-partículas hijas volando hacia afuera desde algún lugar dentro de la jerarquía del Model. Todo ocurriendo a la vez, todo sincronizado con la emisión del Model padre.
El patrón más común es una bola de fuego: un Model que contiene una Part Sphere con textura (el orbe visible), un Beam (la llama que deja tras de sí) y un PointLight (el brillo que proyecta sobre el mundo). Cada emisor hijo debe ser Transformado individualmente — Transformar solo el Model marca el Model en sí pero deja la Sphere hija / Beam / PointLight como decoración visual simple. Con cada hijo también Transformado (Transformed = true), cada partícula-bola de fuego tiene su esfera, su beam de arrastre y su brillo, todos emitidos juntos.
Cómo se propaga el escalado a los emisores anidados
Sección titulada «Cómo se propaga el escalado a los emisores anidados»Las partículas de cada emisor anidado heredan el valor Scale actual del Model padre. El plugin rastrea esto a través de una tabla _parentScaleMap — cuando las partículas de un Beam anidado se actualizan cada fotograma, leen la escala actual del padre y multiplican sus valores Width0/Width1/CurveSize en consecuencia. Así, un Model de bola de fuego cuyo Scale se reduce de 1 a 0.1 durante su vida produce partículas Beam anidadas cuyos anchos también se reducen proporcionalmente.
El coste de implementación es una evaluación de gráfico adicional por fotograma de partícula anidada, además del coste de escala del padre. Para configuraciones profundamente anidadas, esto se acumula — pero el resultado visual es el que la mayoría de los autores esperan.
Las Configs no están pre-escaladas
Sección titulada «Las Configs no están pre-escaladas»Un detalle de implementación sutil: cuando el motor clona un Model, las configs de los emisores hijos no se escalan inmediatamente. Si lo hicieran, Transforms o re-emisiones repetidas acumularían el escalado (un Model escalado 2x que contiene un Beam cuyo Width ya era 2x el original produciría beams escalados 4x). Para evitar eso, el plugin lee la escala del padre en tiempo de ejecución y la aplica al vuelo.
Esta es la arquitectura correcta. Cuesta un poco más en tiempo de ejecución pero significa que las configs de origen permanecen limpias y volver a emitir siempre produce tamaños predecibles.
Vale la pena saber
Sección titulada «Vale la pena saber»Algunas peculiaridades específicas de Model.
PrimaryPart es obligatorio y no se asigna automáticamente. Si haces clic en Transform en un Model sin PrimaryPart, el plugin avisa y se niega. Establécelo manualmente en el Explorador de Studio primero. La mayoría de los flujos de trabajo ya tienen una Part “principal” en mente para un Model — esa suele ser la PrimaryPart correcta.
El coste de clonar crece con el número de descendientes. Un Model con veinte descendientes visibles cuesta aproximadamente veinte veces la duplicación de una sola Part. El plugin no advierte — lo hará tu tasa de fotogramas. Mantén los emisores Model razonables en alcance: si un Model tiene cincuenta descendientes y estás emitiendo a Rate = 30, eso son 1.500 clones de descendientes por segundo pasando por el motor.
Sin Color/Transparency/Brightness a nivel de Model. Cada descendiente es responsable de su propio aspecto. Un efecto de “desvanecer todo el Model con el tiempo” requiere (a) hijos controlados por gráficos (cada Part con su propio gráfico Transparency, configurado antes de Transform) o (b) un script adjunto al Model que anime las propiedades de los hijos.
Material no se propaga. Establecer Material en un Model no tiene efecto en sus descendientes. Cada Part hija conserva su propio Material. Para cambiar el Material de todas las Parts a la vez, edítalas todas (o usa las herramientas de edición masiva — consulta Toolbench).
Las animaciones Motor6D se conservan pero no se ejecutan. Si tu Model tiene un rig Motor6D con un AnimationController y un script de animación, el RenderTemplate clonado conserva el rig intacto. Pero el plugin no activa la reproducción de animación por partícula — si quieres que cada duplicado reproduzca una animación, añade un Script al Model de origen que inicie la reproducción en Instance.AddedSignal o similar.
PivotTo() es la primitiva de posición. La vinculación, el movimiento, todas las actualizaciones posicionales en Models pasan por Model:PivotTo(). El CFrame de la PrimaryPart es lo que lee :PivotTo(), pero el resto de los descendientes siguen. Si encuentras que los duplicados Model se generan en la posición incorrecta, comprueba primero la colocación de la PrimaryPart del Model de origen.
Qué sigue
Sección titulada «Qué sigue»Los tipos de Workspace han terminado. Los tipos restantes en la Particiliary son de naturaleza diferente: efectos de espacio de pantalla que se animan sobre la salida renderizada de la cámara en lugar de en el espacio 3D. Los siguientes cuatro — Blur, Bloom, ColorCorrection, Atmosphere — no tienen posición, no tienen cono de dispersión, no tienen movimiento. Lo que queda es animación de propiedades, aplicada a un efecto de iluminación global. ¿Dónde vive siquiera un “Blur emitido”, y cómo puedes tener más de uno a la vez si Roblox solo renderiza un efecto Blur en Lighting?