Esta página contiene información para ayudar a los desarrolladores experimentados de Unity a comenzar con Roblox, incluyendo una orientación básica, una comparación conceptual y las principales diferencias entre las dos plataformas.
Orientación


La ventana de Jerarquía de Unity y el Explorador de Roblox Studio son las ventanas principales para organizar elementos en escenas 3D:
- Ambos permiten gestionar y organizar objetos (por ejemplo, personajes y activos ambientales).
- Ambos utilizan una estructura de árbol para las relaciones padre-hijo entre objetos.
Sin embargo, la ventana de Jerarquía no tiene una estructura predefinida, mientras que la ventana de Explorador tiene una estructura estricta. Podría ayudar pensar en la ventana de Explorador como una combinación de las ventanas de Jerarquía y Proyecto de Unity, con la carpeta Workspace como el elemento más reconocible.
De manera similar, el Administrador de Activos de Roblox Studio y la Caja de Herramientas se superponen con la ventana Proyecto de Unity. El Administrador de Activos te permite gestionar todos los activos dentro de tu juego, mientras que la Caja de Herramientas te permite acceder a cualquier activo que hayas publicado. La Caja de Herramientas también te permite buscar en la Tienda de Creadores activos de Roblox o de la comunidad, similar a la Tienda de Activos de Unity.
Diferencias filosóficas
Roblox es un "motor de simulación" en lugar de un motor de juego tradicional. Los GameObjects de Unity y Parts de Roblox sirven como los bloques de construcción fundamentales para crear objetos en un entorno 3D, pero en la práctica, los dos son bastante diferentes:
- Representación: Los GameObjects en Unity son un concepto de mayor nivel para cualquier objeto en una escena, mientras que las Parts en Roblox están diseñadas para representar objetos físicos como bloques de madera y esferas de plástico, en lugar de geometría abstracta como objetos primitivos en Unity.
- Física: Para realizar simulaciones físicas en Unity, debes adjuntar componentes como Rigidbody y Collider a un GameObject. En Roblox, la física está integrada en el tipo de datos Parts; el motor gestiona las interacciones automáticamente.
Puedes ver la diferencia de inmediato si creas un GameObject y una Part. El GameObject no tiene más que una posición, rotación y escala. La Part tiene esa misma información, más un material y color, valores de reflectancia y transparencia, masa y forma, y mucho más. Convertir una Part en algo más parecido a un GameObject vacío significa eliminar muchas propiedades integradas. Por el contrario, puedes hacer que un GameObject se parezca mucho a una Part añadiendo componentes como MeshFilter, MeshRenderer, Collider y Rigidbody.
Desde una perspectiva de scripting, el GameObject es más similar a la Instance de Roblox, la clase base para todas las demás clases de Roblox, pero dado que no puedes (y no debes) crear objetos de tipo Instance, la comparación no es especialmente práctica.
Otra comparación es el GameObject de Unity con la Model de Roblox. Los modelos actúan como un contenedor para una colección de partes interconectadas de la misma manera que podrías establecer una relación padre-hijo entre muchos GameObjects en Unity. Especificas una de las partes del modelo como su parte principal para definir el punto de pivote. Los modelos también contienen scripts, animaciones, efectos de sonido, indicaciones, restricciones, emisores de partículas y más.
Por ejemplo, un GameObject de Unity podría tener componentes para ParticleSystem, Physics3D, SpringConstraint, y un script. En la ventana de Jerarquía, verías un único GameObject llamado SpringyFireball. La ventana de Inspector muestra la colección de componentes y propiedades.
En Roblox, un modelo comparable llamado SpringyFireball en la ventana de Explorador podría verse algo así:
Model|- ParticleEmitter|- MeshPart|- SpringConstraint|- ClickDetector| |- Script
La filosofía de física por defecto de Roblox se extiende al proceso de construcción de modelos 3D. En Roblox, soldar múltiples partes juntas en un conjunto es una excelente manera de construir cosas rápidamente porque Roblox trata las partes soldadas como un único cuerpo rígido. Este enfoque no está disponible en Unity.
En lugar de usar unidades métricas estándar para longitud y masa, Roblox utiliza unidades nocionales llamadas studs y Unidades de Masa de Roblox (RMUs). Para conversiones métricas aproximadas y recomendaciones sobre su uso, consulta Unidades.
La ubicación importa
Los juegos de Roblox son multijugador por defecto, por lo que Roblox Studio incluye muchas ubicaciones de almacenamiento diferentes con comportamientos específicos. Para más información, consulta tiempo de ejecución de cliente-servidor y organización de objetos.
| Location | Description |
|---|---|
| Workspace | Representa el mundo 3D del juego. Esta ubicación funciona bien para scripts de servidor que se adjuntan directamente a 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 ModuleScripts que deseas usar tanto en el servidor como en el cliente. LocalScripts no se ejecutan desde esta ubicación, pero Scripts con un RunContext de Client sí lo hacen. |
| ServerScriptService | Contiene scripts de servidor. Esta ubicación es ideal para scripts que necesitan acceder a funcionalidades u 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 de propósito general que se ejecutan cuando el jugador se une al juego. |
| StarterGui | Contiene elementos de la GUI que el cliente muestra cuando carga el juego. LocalScripts pueden ejecutarse desde esta ubicación. Esta ubicación es ideal para scripts que modifican la interfaz de usuario del juego, como agregar botones, menús y ventanas emergentes. |
| StarterPack | Generalmente solo contiene Tools, pero también puede incluir LocalScripts para configurar las mochilas de los jugadores. |
Scripting
Los juegos de Roblox admiten tres tipos diferentes de scripts de Luau:
Scripts del cliente
Estos scripts se ejecutan en el cliente y el servidor no tiene visibilidad sobre su comportamiento. Por razones de compatibilidad, estos scripts pueden tomar la forma de LocalScripts o Scripts con un valor de RunContext de Client. Los scripts del cliente generalmente se encuentran en ReplicatedStorage, StarterPlayerScripts o StarterCharacterScripts.
Scripts del servidor
Estos scripts se ejecutan en el servidor y el cliente no tiene visibilidad sobre su comportamiento. Los scripts del servidor tienen un valor de RunContext de Server y generalmente se encuentran en ServerScriptService, cuyo contenido no se replica al cliente.
Scripts de módulo
Estos scripts son piezas de código reutilizables que devuelven exactamente un valor, típicamente una función o tabla (o una tabla de funciones). En lugar de duplicar código en scripts del cliente y del servidor, utiliza scripts de módulo para compartir código y datos entre ambos. Los scripts de módulo suelen alojarse en ReplicatedStorage, pero pueden estar en otros lugares si deseas compartir código entre scripts en el mismo lado de la frontera cliente-servidor.
Unity no tiene el concepto de diferentes tipos de scripts. Si decides hacer un juego multijugador, Unity utiliza sus bibliotecas de red para indicar cuándo un GameObject (y sus scripts) deben ser exclusivos para el servidor.
En Unity, gran parte de la funcionalidad del motor está disponible a través de los métodos de MonoBehaviour. Por ejemplo, para ejecutar código antes del bucle de renderizado, agregas código al método Update(). Para manejar eventos de colisión de física, agregas código al método OnCollideEnter().
Los scripts de Roblox son más impulsados por eventos. Puedes acceder a funcionalidad similar suscribiéndote a servicios y escuchando actualizaciones.
C# y Luau
Para scripting, Unity utiliza C#. Roblox utiliza Luau, un lenguaje de scripting derivado de Lua 5.1.
Comparado con C#, Luau es de tipado gradual y generalmente tiene una sintaxis menos verbosa. Sin embargo, en proyectos más grandes, el tipado gradual puede introducir categorías de errores que lenguajes fuertemente tipados como C# evitan, así que considera habilitar comprobación de tipos estricta en los scripts de Roblox.
Para diferencias básicas de sintaxis entre los lenguajes de scripting, consulta Comparación de Luau y C#.
Ejemplo de código Luau
El siguiente ejemplo de código Luau demuestra cómo, después de que un jugador equipe una caña de pescar, escuchar la entrada del usuario (en este caso, la tecla E) y llamar a funciones adicionales:
local ContextActionService = game:GetService("ContextActionService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Obtener un script de módulo de ReplicatedStorage que devuelve una única función
local performSomeAction = require(ReplicatedStorage.performSomeAction)
-- Supone que este script es un hijo de la caña de pescar
local fishingPole = script.Parent
local ACTION_CAST = "Lanzar"
-- Verifica que la tecla esté presionada, luego llama a otra función
local function castLine(_actionName, inputState, _inputObject)
if inputState == Enum.UserInputState.Begin then
performSomeAction()
end
end
-- Solo habilita la acción cuando el jugador equipa la caña de pescar
fishingPole.Equipped:Connect(function()
ContextActionService:BindAction(ACTION_CAST, castLine, true, Enum.KeyCode.E)
end)
-- Deshabilita la acción cuando el jugador desequipa la caña de pescar
fishingPole.Unequipped:Connect(function()
ContextActionService:UnbindAction(ACTION_CAST)
end)
El script de Roblox puede ser relativamente conciso porque Roblox tiene muchas suposiciones integradas: un Player con un personaje Humanoid conectado al servidor y puede equipar Tools. Estas suposiciones no existen en Unity, así que la implementación sería muy diferente.
Activos
Unity y Roblox admiten la importación de mallas y modelos personalizados en formato .fbx. Ciertos tipos de activos pueden requerir configuraciones y ajustes de exportación específicos de tu software de modelado de terceros. Para más información, consulta las siguientes páginas:
En Unity, los objetos se importan a tu directorio de Assets, visible en la ventana Proyecto. En Roblox, los activos se importan en tu Workspace y en la Caja de Herramientas o en el Administrador de Activos.
Roblox también ofrece un plugin de Blender de código abierto para agilizar el proceso de importación.
Transformaciones
Las transformaciones de Unity y CFrames de Roblox sirven propósitos similares al representar transformaciones 3D de objetos:
- Tanto las transformaciones como CFrames representan la posición y rotación de un objeto en un espacio 3D. Las transformaciones incluyen escala, mientras que Roblox utiliza una propiedad BasePart.Size que no es parte de CFrame.
- Ambos soportan la multiplicación para transformaciones complejas y tienen métodos incorporados para otras manipulaciones.
Colaboración
En Unity, colaboras con sistemas estándar de control de versiones o servicios de pago como el Control de Versiones de Unity.
Los archivos de Roblox residen en la nube (aunque puedes exportar copias), por lo que Roblox Studio proporciona flujos de trabajo de colaboración integrados para edición simultánea, gestión de grupos, permisos, redacción de scripts y más. Consulta Colaboración.
Plugins
Similar a las herramientas de Unity, Roblox Studio admite plugins, que pueden simplificar o darte un control adicional sobre varios aspectos del proceso de desarrollo. Los plugins están disponibles en la Tienda de Creadores, al igual que los activos, muchos de forma gratuita.
Glosario
| Unity | Roblox | Notas |
|---|---|---|
| Escena | Lugar | |
| GameObject | Part o Model | Consulta Diferencias filosóficas. |
| Prefab | Paquete | |
| Transformación | CFrame | CFrame no incluye información de escala. Consulta Transformaciones. |
| Jerarquía | Explorador | |
| Inspector | Propiedades | |
| Vista de escena | Viewport 3D | |
| Vista de juego | Viewport 3D | El viewport se convierte en una vista de juego cuando pruebas tu juego. |
| Ventana de proyecto | Administrador de Activos o Caja de Herramientas | |
| Inspector de terreno | Editor de Terreno | |
| Punto de aparición | SpawnLocation | |
| Consola | Salida | |
| Tienda de activos | Tienda de Creadores | |
| Superposiciones | Barra de herramientas | |
| Herramienta | Plugin |