Para muchos desarrolladores, el desafío fundamental de adaptarse a la programación en Roblox es la importancia de la ubicación del archivo y la propiedad Script.RunContext. Dependiendo del tipo de script, la ubicación en el Explorer y el contexto de ejecución, los scripts pueden comportarse de manera muy diferente. Ciertas llamadas a métodos pueden fallar, los objetos en tu juego pueden ser inaccesibles o los scripts pueden no ejecutarse en absoluto.
La razón de esta complejidad es que los juegos de Roblox son multijugador por defecto. Los scripts necesitan la capacidad de ejecutarse solo en el servidor, solo en el cliente o ser compartidos entre ambos. La evolución de la plataforma Roblox a lo largo del tiempo ha complicado aún más la situación.
Tipos de scripts
Roblox tiene tres tipos de scripts:
- Script - Código que se ejecuta en el servidor o en el cliente, dependiendo de su ubicación y la propiedad Script.RunContext.
- LocalScript - Código que se ejecuta solo en el cliente. No tiene un contexto de ejecución.
- ModuleScript - Código que puedes reutilizar en otros scripts. No tiene un contexto de ejecución.
Cuando creas un Script, su contexto de ejecución predeterminado es Legacy, lo que significa que a) es un script del lado del servidor y b) solo se ejecuta si está en un contenedor del servidor, como ServerScriptService o Workspace.
- Si cambias el contexto de ejecución del script a Server, ahora también puede ejecutarse en ReplicatedStorage, pero no lo recomendamos. El contenido de esa ubicación se replica a los clientes, por lo que es una mala ubicación para scripts del lado del servidor.
- Si cambias el contexto de ejecución del script a Client, puede ejecutarse en ReplicatedStorage. También puede ejecutarse en StarterCharacterScripts y StarterPlayerScripts. Sin embargo, los contenedores de inicio se copian a los clientes, por lo que el script original y la copia se ejecutan, lo cual no es deseable.
Para cambiar el contexto de ejecución de un script, selecciónalo en el Explorer y cambia el valor en la ventana de Properties.

Recomendaciones
Coloca un solo Script con un RunContext de Client en ReplicatedStorage.
Coloca un solo Script con un RunContext de Server en ServerScriptService.
Utiliza ModuleScripts para la mayor parte del código del cliente y del servidor posible. Requiere estos módulos desde tu script del cliente y tu script del servidor.
Este enfoque le da a tu código un único punto de entrada en los lados del cliente y del servidor, lo que simplifica la organización y facilita la aislamiento o desactivación de módulos problemáticos. Agrega una función start() a cada ModuleScript para que todos los módulos puedan cargarse antes de que comiences a ejecutar su código:
Ejemplo de script del servidor--!strictlocal ServerScriptService = game:GetService("ServerScriptService")local SampleModule = require(ServerScriptService.SampleModule)local AnotherSampleModule = require(ServerScriptService.AnotherSampleModule)SampleModule.start()AnotherSampleModule.start()Ejemplo de módulo--!strictlocal CollectionService = game:GetService("CollectionService")local NPC_TAG = "npc"local SampleModule = {}local function setUpNpc(npc: Instance)-- inicializar cada NPCendlocal function cleanUpNpc(npc: Instance)-- ejecutar cuando se dispare el eventoendfunction SampleModule.start() -- agregar la función a la tabla-- bucle de ejemplo para configuración basado en etiquetasfor _, npc in CollectionService:GetTagged(NPC_TAG) dosetUpNpc(npc)end-- ejecutar funciones cuando se disparen eventosCollectionService:GetInstanceAddedSignal(NPC_TAG):Connect(setUpNpc)CollectionService:GetInstanceRemovedSignal(NPC_TAG):Connect(cleanUpNpc)endreturn SampleModulePara compartir código, utiliza ModuleScripts en ReplicatedStorage y requiérelo en tu script del cliente y tu script del servidor.
Si es necesario para tu juego, repite el mismo patrón en ReplicatedFirst con un solo script del cliente y un número mínimo de ModuleScripts para implementar una pantalla de carga. Para aprender más sobre ReplicatedFirst, consulta Orden de replicación.
Utiliza LocalScripts con moderación. Si debes usarlos, colócalos en StarterCharacterScripts, StarterPlayerScripts, StarterGui o StarterPack.
Los scripts en estos contenedores se clonan a los contenedores de los jugadores en lugar de ejecutarse desde una ubicación, lo que puede complicar la depuración. Usar ReplicatedStorage para el código del cliente te permite hacer clic en líneas en la ventana de Output y ir a ReplicatedStorage.YourScript (la ubicación estable del script) en lugar de Players.YourName.PlayerScripts.YourLocalScript (la ubicación efímera a la que se copió el script en tiempo de ejecución).
Evita adjuntar scripts directamente a instancias en Workspace. En su lugar, etiqueta instancias y utiliza CollectionService para trabajar con ellas desde un solo ModuleScript.
La excepción clave es si distribuyes modelos o paquetes en la Tienda de Creadores. En ese caso, es posible que necesites incluir scripts dentro de la jerarquía de instancias; especifica un RunContext para cada script para eliminar la ambigüedad sobre cómo se ejecuta. Establecer explícitamente esta propiedad hace que los modelos y paquetes tengan más probabilidades de funcionar correctamente desde una variedad de ubicaciones.
Ejemplo de estructura de proyecto
El proyecto de referencia Plant muestra cómo podrías organizar tu código en un juego grande y complejo. Almacena la gran mayoría de su código como ModuleScripts reutilizables.
Ubicaciones de scripts
| Location | Description |
|---|---|
| Workspace | Representa el mundo 3D del juego. Puede ejecutar scripts del servidor que se adjuntan directamente a los objetos y controlan su comportamiento. |
| ReplicatedFirst | Contiene objetos que se replican al cliente antes que cualquier otra cosa. Esta ubicación es ideal para el conjunto mínimo absoluto de objetos y scripts del cliente necesarios para mostrar una pantalla de carga. |
| ReplicatedStorage | Contiene objetos que se replican tanto al cliente como al servidor. Esta ubicación es ideal para Scripts con un RunContext de Client, ModuleScripts del cliente, y ModuleScripts que deseas usar tanto en el servidor como en el cliente. LocalScripts no se ejecutan desde esta ubicación. |
| ServerScriptService | Contiene scripts del servidor. Esta ubicación es ideal para scripts que necesitan acceder a la funcionalidad o a objetos del lado del servidor, como la lógica del juego y el almacenamiento en la nube. |
| ServerStorage | Contiene objetos del lado del servidor. Esta ubicación es ideal para objetos grandes que no necesitan ser replicados inmediatamente a los clientes cuando se unen a un juego. Los scripts no se ejecutan desde esta ubicación, pero puedes almacenar ModuleScripts del lado del servidor aquí. |
| StarterPlayer ⟩ StarterCharacterScripts | Contiene LocalScripts que se ejecutan cuando el personaje aparece. |
| StarterPlayer ⟩ StarterPlayerScripts | Contiene LocalScripts que se ejecutan cuando el jugador se une al juego. |
| StarterGui | Contiene elementos de GUI que el cliente muestra cuando carga el juego. LocalScripts pueden ejecutarse desde esta ubicación. |
| StarterPack | Generalmente solo contiene Tools, pero también puede incluir LocalScripts para configurar las mochilas de los jugadores. |
Esta imagen muestra qué ubicaciones de la ventana Explorer pueden contener scripts del cliente. Recuerda, ReplicatedFirst y ReplicatedStorage pueden contener Scripts con un RunContext de Client, mientras que los contenedores Starter[] deben usar LocalScripts.
