Ensamblar una biblioteca de activos

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.


Ensamblar una biblioteca de activos es el proceso de importar y configurar una colección de activos en un lugar central dentro de tu juego para un fácil acceso y reutilización. Este proceso puede ahorrarte un tiempo significativo mientras te preparas para construir tu entorno, especialmente si configuras los valores de cada activo para mejorar el rendimiento y optimizar el uso de memoria en dispositivos de gama media a baja.

Usando el archivo de referencia Arte Ambiental - Ensamblaje .rbxl, esta sección del currículo de arte ambiental te muestra cómo ensamblar una biblioteca de activos a partir de tus activos pulidos, incluyendo instrucciones paso a paso sobre:

  • Crear materiales personalizados para tu terreno a partir de tus texturas repetibles.
  • Crear objetos SurfaceAppearance para tu hoja de recortes y aplicarlos a mallas desenrolladas en tu biblioteca de activos.
  • Configurar parámetros de renderizado para tus activos para asegurar un rendimiento óptimo en todos los dispositivos.
  • Convertir tus activos en paquetes para que puedas actualizarlos y reutilizarlos en todos tus proyectos.

Después de completar esta sección, aprenderás a utilizar tu biblioteca de activos de maneras creativas para reemplazar o convertir el entorno de caja gris y agregar los toques finales que mejoren el espacio 3D en general.

El kit modular y de props del juego de láser tag de muestra.

Crear materiales personalizados

Studio representa los materiales personalizados como objetos MaterialVariant dentro de MaterialService. Estos objetos MaterialVariant tienen cuatro propiedades que combinan los cuatro mapas de textura repetibles para crear un material personalizado de alta calidad con características físicas:

Después de proporcionar los mapas de textura a estas propiedades, puedes aplicar tu nuevo material personalizado a partes, mallas y terrenos. Puedes usar o modificar los archivos de mapa de textura de muestra .png para crear los materiales personalizados de Musgo Grumoso, Musgo Grumoso Florido, Musgo Grumoso con Piedras y Piedras dentro del entorno final de láser tag de muestra, o puedes usar los tuyos que diseñaste en la sección anterior del tutorial.

Para crear objetos MaterialVariant para tus texturas repetibles:

  1. Desde el menú Ventana ⟩ 3D, selecciona Material para abrir el Administrador de Materiales.

  2. En la lista de Materiales, selecciona el material base que más se alinee con tu textura repetible. Por ejemplo, si estuvieras creando un objeto MaterialVariant para la textura repetible de Musgo Grumoso, elige el material de suelo predeterminado para que el material herede sus propiedades físicas.

  3. En la barra de herramientas superior, haz clic en el ícono ⊕. Un nuevo MaterialVariant se muestra en la paleta con un ícono en la esquina inferior derecha que indica que es un material personalizado.

    Nuevo tile MaterialVariant en el Administrador de Materiales con un ícono que indica un material personalizado
  4. En el Inspector, navega a la sección General, luego renombra el material para que coincida con el nombre de tu textura repetible.

    La vista del Inspector con el nombre del material resaltado.
  5. En la sección Mapas de Textura, en el lado derecho de Color, haz clic en el botón Importar. Se muestra un explorador de archivos.

    La sección de Mapas de Textura de la vista del Inspector con el botón Importar resaltado.
  6. En el explorador de archivos, selecciona el archivo de mapa de textura Albedo .png para la textura repetible correspondiente, luego haz clic en el botón Abrir. El explorador de archivos se cierra y el nuevo mapa de color se muestra con su ID de activo.

  7. Repite este proceso para los mapas de textura Metalness, Normal y Roughness. El material personalizado se actualiza para reflejar los mapas de textura.

    Todos los mapas de textura para el material Moss_Lumpy_A.
    Parte de esfera con el material Moss_Lumpy_A aplicado.
  8. En la sección Sobrescrituras, habilita el interruptor Establecer como Sobrescritura para asegurarte de que cuando apliques el suelo a tu terreno, Studio use este material personalizado.

    El interruptor Establecer como Sobrescritura habilitado.
  9. OPCIONAL
    Si estás creando un material personalizado que representa un material orgánico,

    1. En la sección Tiling, haz clic en el menú desplegable Patrón.
    2. Selecciona Orgánico para aleatorizar la salida y reducir el tiling visible.
    La sección Tiling de la vista del Inspector con sus configuraciones.
  10. Repite este proceso para cada textura repetible que desees incluir en tu juego.

Crear paquetes de SurfaceAppearance

Studio utiliza hojas de recortes dentro de objetos SurfaceAppearance que puedes parentar a MeshParts que contienen datos UV. Similar a los materiales personalizados, los objetos SurfaceAppearance tienen cuatro propiedades que combinan los cuatro mapas de textura de la hoja de recortes para crear un tratamiento visual 3D de alta calidad:

SurfaceAppearance.ColorMap – Representa el mapa de textura de albedo.
SurfaceAppearance.MetalnessMap – Representa el mapa de textura de metalicidad.
SurfaceAppearance.NormalMap – Representa el mapa de textura normal.
SurfaceAppearance.RoughnessMap – Representa el mapa de textura de rugosidad.

Después de proporcionar los mapas de textura a estas propiedades, puedes hacer que el objeto SurfaceAppearance sea un hijo de un MeshPart con datos UV que se mapean a tu hoja de recortes, y los datos UV se aplican automáticamente a la malla padre. Por esta razón, es útil hacer que el objeto SurfaceAppearance sea un paquete para que puedas reutilizar el mismo objeto SurfaceAppearance en todos tus activos modulares y props. Por ejemplo, las siguientes mallas tienen datos UV que se mapean al mismo diseño de hoja de recortes que se representa dentro de un solo paquete de objeto SurfaceAppearance.

Puedes usar o modificar los archivos de mapa de textura de muestra .png para crear un objeto SurfaceAppearance que respete los datos UV para los activos modulares y props de muestra dentro del entorno final de láser tag, o puedes usar los tuyos que diseñaste en la sección anterior del tutorial que se aplican a tus propios activos modulares y props.

Para crear paquetes de SurfaceAppearance que puedes parentar a tu kit modular y props:

  1. Inserta un objeto SurfaceAppearance en Workspace.

  2. Selecciona el objeto SurfaceAppearance, luego en la ventana de Propiedades, selecciona la propiedad ColorMap. Se muestra un pop-up.

  3. Haz clic en el botón Agregar Imagen…. Se muestra un explorador de archivos.

    El pop-up de ColorMap con el botón Agregar Imagen resaltado.
  4. Selecciona el mapa de textura Albedo para la textura repetible correspondiente, luego haz clic en el botón Abrir. El explorador de archivos se cierra y la propiedad ColorMap se actualiza con un nuevo ID de activo.

  5. Repite este proceso para las propiedades MetalnessMap, NormalMap y RoughnessMap, seleccionando sus respectivos mapas de textura del explorador de archivos.

  6. En la ventana de Explorer, haz clic derecho en el objeto SurfaceAppearance, luego selecciona Convertir a Paquete del menú contextual. Se muestra el diálogo Convertir a Paquete.

  7. Completa los campos Título y Descripción, establece la propiedad de propiedad en ti mismo o en un grupo, luego haz clic en el botón Enviar. Una vez completado, un símbolo de cadena se muestra sobre el ícono del objeto SurfaceAppearance para identificarlo como un paquete.

    El ícono de Surface Appearance con un símbolo de cadena.
  8. OPCIONAL
    Selecciona el objeto hijo PackageLink del objeto SurfaceAppearance, luego en la ventana de Propiedades, habilita AutoUpdate para actualizar automáticamente el paquete si realizas alguna modificación en el objeto SurfaceAppearance.

Importar activos modulares y props

Studio representa los activos modulares y props que importas como objetos Model con MeshParts hijos para cada componente del activo. Por ejemplo, si importas una sección de pared con un recorte superior, un recorte inferior y un componente de pared, Studio representa el archivo .fbx o .obj como un Wall_Section Model con hijos separados Top_Trim, Bottom_Trim y Wall MeshParts.

Usando el Importador, puedes importar el kit modular de muestra y props en Studio para su uso en tu biblioteca de activos, o puedes importar cualquier activo que diseñaste en la sección anterior del tutorial. Para más información sobre la funcionalidad de esta herramienta, consulta Importador.

Para importar tus activos modulares y props en el juego:

  1. Desde el menú Archivo, selecciona Importar. Se muestra un explorador de archivos.

  2. Selecciona un archivo .fbx para un activo modular o prop.

  3. Verifica la vista previa del objeto y asegúrate de que la configuración de importación sea correcta para tu objeto.

  4. Verifica cualquier mensaje de advertencia o error.

  5. Haz clic en Importar. El activo se muestra en la ventana de Explorer y en la vista.

  6. Repite este proceso para cada activo modular y prop.

  7. Mueve todos tus activos a un área de tu juego cerca de tu geometría de caja gris. Esta zona es tu biblioteca de activos.

Aplicar datos de SurfaceAppearance

Cuando pasas por el proceso de desenrollar los UVs de una malla en software de modelado de terceros, el software almacena los datos UV dentro del archivo .fbx o .obj de la malla. Cuando importas esa malla en Studio, el objeto MeshPart resultante retiene esos datos, pero aún necesitas aplicar un objeto SurfaceAppearance con propiedades de mapa de textura de tu hoja de recortes para mostrar tus texturas de recorte en el activo.

Para aplicar datos de mapa de textura SurfaceAppearance a mallas desenrolladas en tu biblioteca de activos:

  1. En la ventana de Explorer, haz clic en tu paquete SurfaceAppearance, luego presiona CtrlD (⌘D) para duplicarlo.
  2. Parentar el paquete duplicado SurfaceAppearance a un activo modular o a un prop. El activo aplica sus datos UV a los mapas de textura y muestra su tratamiento visual.
  3. Repite este proceso para cada activo modular y prop.

Establecer parámetros de física y renderizado

Ahora que tienes tus activos dentro de Studio, es importante establecer parámetros de física y renderizado que permitan a los activos mantener la más alta calidad visual posible en dispositivos con limitaciones de memoria y GPU. En general, cuanto más te adhieras a la guía en esta sección, más eficiente será tu juego. Sin embargo, es importante considerar cuidadosamente el contexto de dónde planeas colocar cada activo dentro del entorno general para asegurarte de que mantienes tus objetivos estéticos y requisitos de juego.

Anclado

La propiedad BasePart.Anchored determina si el sistema de física del motor de Roblox afecta la posición del objeto. Cuando habilitas esta propiedad para un Part o MeshPart, elimina el objeto de los cálculos físicos de la simulación dinámica que siempre se está ejecutando en el juego, lo que significa que el objeto nunca cambiará de posición debido a la gravedad o colisiones con otros objetos.

Los objetos que no simulan una respuesta física son más baratos de renderizar porque no ocupan la GPU que es necesaria para esos cálculos físicos. Cuando liberas GPU, mejoras el rendimiento de tu juego, especialmente en dispositivos de gama baja que necesitan ahorrar GPU para un juego rápido. Por esta razón, cada activo, aparte de las puertas en el entorno final de láser tag de muestra, está anclado.

CanCollide

La propiedad BasePart.CanCollide determina si el objeto puede interactuar físicamente con otros objetos. Cuando habilitas esta propiedad para un Part o MeshPart, el objeto es impenetrable, y el motor de Roblox lo tiene en cuenta en los cálculos físicos. Estos cálculos pueden afectar el rendimiento de tu juego cuando hay muchos objetos que el motor debe considerar en sus cálculos físicos.

Para aliviar parte de este impacto en el rendimiento, desactiva esta propiedad para objetos con los que el usuario nunca interactuará. Por ejemplo, el entorno final de láser tag desactiva esta propiedad para todo el follaje.

CanTouch

La propiedad BasePart.CanTouch determina si se activan los eventos Touched y TouchEnded en el objeto. Cuando habilitas esta propiedad para un Part o MeshPart, el motor de Roblox verifica el estado del evento de toque del objeto para ver si necesita activar o detener un evento.

Este proceso ocurre para cada cuadro, lo que puede ocupar una cantidad significativa de memoria si el motor necesita verificar el estado del evento de toque para muchos objetos a la vez. Para aliviar parte de este impacto en la memoria, habilita esta propiedad solo para objetos que deben activar un evento.

CanQuery

La propiedad BasePart.CanQuery determina si el motor de Roblox considera el objeto durante las operaciones de consulta espacial, como el raycasting. Studio habilita esta propiedad para cada Part o MeshPart por defecto, lo que significa que el motor verifica si cada objeto necesita llamar a una operación de consulta espacial. Este proceso ocurre para cada cuadro, lo que puede ocupar una cantidad significativa de memoria cuando el motor necesita hacer estas verificaciones para muchos objetos a la vez.

Por esta razón, se recomienda desactivar esta propiedad para objetos que el motor de Roblox no necesita considerar para operaciones de consulta espacial. Al tomar decisiones sobre dónde desactivar esta propiedad, considera cómo cada activo impacta el juego. Por ejemplo, el entorno final de láser tag mantiene esta propiedad habilitada para cada pared en el edificio porque el motor necesita tener en cuenta estas superficies a medida que los usuarios disparan láseres desde su pistola de láser tag. Si el motor no tiene en cuenta estos activos, el láser pasaría directamente a través del edificio como si no estuviera allí en absoluto.

CastShadow

La propiedad BasePart.CastShadow determina si el objeto proyecta una sombra. Cuando habilitas esta propiedad para un Part o MeshPart, el motor de Roblox calcula la ubicación de cada vértice del objeto en tiempo de ejecución, luego dibuja un raycast desde el sol hacia cualquiera de sus objetos vecinos hasta que colisiona con otro objeto para crear la sombra.

Estos cálculos pueden tener un costo de rendimiento, especialmente cuando tienes muchos objetos de complejidad geométrica. Esto se debe a que los objetos con complejidad geométrica tienen más polígonos que los objetos que son geométricamente simples, lo que significa que tienen más vértices que el motor necesita calcular para la sombra del objeto. Cuantos menos polígonos tenga un objeto, más rápida será la operación y más barata su sombra.

Una sección de pared con pocos polígonos, y una planta con muchos polígonos proyectando sombras sobre una pared blanca.

Las sombras pueden proporcionar una gran sensación de realismo a objetos con profundidad geométrica 3D, así que cuando decidas dónde desactivar esta propiedad, considera dónde los objetos proporcionan una mejora visual significativa al entorno y dónde los usuarios notarán sombras faltantes. Por ejemplo, las sombras complejas del follaje pueden proporcionar una gran sensación de inmersión en el espacio exterior donde los usuarios probablemente las verán, pero esa misma inmersión no es necesaria para el follaje que asoma a través del techo con el que los usuarios nunca interactuarán.

Follaje proyectando sombras.
BasePart.CastShadow = Habilitado
Follaje no proyectando sombras.
BasePart.CastShadow = Deshabilitado

DoubleSided

La propiedad MeshPart.DoubleSided determina si se renderizan ambas caras o polígonos en la malla. Cuando habilitas esta propiedad para un MeshPart plano, como hojas, cabello o tarjetas de tela, el motor de Roblox renderiza ambas caras o polígonos en la malla para permitir que los usuarios vean la plenitud del objeto sin importar el ángulo desde el que miren el objeto. Por ejemplo, las siguientes hojas de árbol son mallas planas de un solo lado, y cuando habilitas esta propiedad, cualquiera de las hojas que miren hacia el lado opuesto de la cámara se vuelven visibles para el usuario.

Un árbol con menos hojas porque todas las mallas planas que miran hacia el lado opuesto de la cámara están deshabilitadas.
MeshPart.DoubleSided = Deshabilitado

Esta propiedad es útil para agregar realismo a tu entorno, pero tiene un costo de rendimiento porque el motor necesita renderizar los polígonos del objeto dos veces: una vez para la dirección que mira hacia la cámara del usuario, y nuevamente para cualquier malla que mire hacia el lado opuesto de la cámara del usuario. Para aliviar parte de este impacto en el rendimiento, el entorno final de láser tag solo habilita esta propiedad para el follaje porque tiene un fuerte impacto visual para el realismo en el espacio 3D.

CollisionFidelity

La propiedad MeshPart.CollisionFidelity determina cuán de cerca la caja de colisión física de una malla o unión coincide con su representación visual. Por defecto, esta configuración renderiza una caja de colisión que es aproximadamente la misma que la forma poligonal de la malla, lo que significa que donde los usuarios colisionan con el objeto es similar a la geometría real de la malla. Por ejemplo, la malla del castillo en las siguientes imágenes tiene una caja de colisión predeterminada que casi coincide con la forma de su geometría.

Una malla de castillo gris.
Malla Original
La misma malla de castillo con una caja de colisión colorida que muestra dónde los usuarios pueden colisionar con el castillo.
Predeterminado

Puedes establecer esta propiedad en un valor diferente para reducir la precisión de la caja de colisión de una malla. Por ejemplo, cuando estableces esta propiedad en Hull, el motor de Roblox reduce significativamente los vértices de la caja de colisión de la malla, y cuando estableces esta propiedad en Box, el motor reduce la caja de colisión de la malla a un cubo que rodea la malla. Además, si deseas aumentar la precisión de la caja de colisión de una malla, puedes establecer esta propiedad en PreciseConvexDecomposition para aumentar la cantidad de vértices en la caja de colisión.

La misma malla de castillo con una caja de colisión cúbica que muestra dónde los usuarios pueden colisionar con el castillo.
Box
La misma malla de castillo con una caja de colisión cilíndrica que muestra dónde los usuarios pueden colisionar con el castillo.
Hull
La misma malla de castillo con una caja de colisión colorida que muestra dónde los usuarios pueden colisionar con el castillo. Esta versión muestra más caras coloridas que la caja de colisión predeterminada.
PreciseConvexDecomposition

Similar a BasePart.CastShadow, cuanto más vértices necesita renderizar el motor de Roblox, mayor es el costo de rendimiento. Por esta razón, es importante considerar cómo deseas que los usuarios interactúen con cada malla para ver si puedes reducir la cantidad de vértices que el motor necesita renderizar para la caja de colisión de la malla. En casos donde no es necesario que una caja de colisión sea precisa, establece esta propiedad en Box o Hull.

Para demostrar este concepto, consulta las siguientes imágenes que muestran la caja de colisión de cada malla del modelo de pared que proporciona un aumento de elevación entre el primer y segundo piso del entorno final de láser tag de muestra. La caja de colisión predeterminada para la pared principal tiene mucha geometría innecesaria cuando solo necesita proporcionar una superficie para evitar que el usuario se mueva en esa dirección. Si estableces la propiedad en Box para esta malla, puedes eliminar esta geometría redundante mientras mantienes el propósito de la caja de colisión intacto.

Un modelo de pared que proporciona un aumento de elevación.
Malla Original
El mismo modelo de pared con una caja de colisión colorida que muestra dónde los usuarios pueden colisionar con la pared.
Predeterminado
El mismo modelo de pared con una caja de colisión colorida para el recorte, pero solo una caja de colisión para la malla de la pared.
Box

Al tomar estas decisiones, es importante considerar cómo cambiar el valor predeterminado puede afectar negativamente a los usuarios mientras navegan por tu entorno. Por ejemplo, si estableces la propiedad en Box para las mallas de recorte del modelo de pared, los usuarios colisionarían con la caja de colisión si intentan saltar cerca de la pared. En su lugar, establece estas mallas en Hull para reducir su conteo de vértices mientras mantienes la caja de colisión más cerca de la forma de la geometría de la malla.

Un modelo de pared con una caja de colisión para el recorte superior. Debido a que la caja sobresale, los usuarios pueden colisionar involuntariamente con el recorte superior.
Box
El mismo modelo de pared con una caja de colisión para el recorte superior. Debido a que la caja de colisión se ajusta mucho más cerca de la parte superior del modelo, permite a los usuarios evitar colisionar con el recorte.
Hull

Ten en cuenta que puede ser importante tener una caja de colisión que se ajuste precisamente a la forma de tu malla, especialmente cuando necesitas controlar exactamente cómo los usuarios colisionan con su forma. Por ejemplo, en el entorno final de láser tag de muestra, es importante que los usuarios solo colisionen con los bordes de la puerta y no con la puerta misma, de lo contrario, nunca podrían entrar o salir de un área de combate.

Un modelo de puerta con mallas de caja de colisión optimizadas.

RenderFidelity

La propiedad MeshPart.RenderFidelity determina el nivel de detalle de la malla que se muestra al usuario. Cuando estableces esta propiedad en Enum.RenderFidelity.Automatic, el motor de Roblox reduce la fidelidad de la malla cuanto más lejos esté el usuario de la malla, y cuando estableces esta propiedad en Enum.RenderFidelity.Precise, cada vértice de tu malla se renderiza exactamente como lo deseas sin importar la distancia entre ellos.

Cuantos más objetos el motor debe renderizar con precisión para el usuario desde cualquier distancia, especialmente si tienen un alto conteo de vértices, mayor es el costo de rendimiento. Para aliviar parte de este impacto en el rendimiento, establece esta propiedad en Enum.RenderFidelity.Performance para objetos con complejidad geométrica, como el follaje en la biblioteca de activos de muestra, porque no necesitan mostrarse en su totalidad desde una distancia para ningún requisito de juego. Esto reduce el conteo de polígonos de tu juego sin sacrificar la calidad visual general.

Convertir activos en paquetes

Ahora que todos tus activos modulares están en Studio con parámetros de renderizado que están configurados para mantener su alta calidad visual para todos los usuarios, es hora de convertirlos en paquetes. Es importante convertir tus activos en paquetes porque te permite reutilizarlos repetidamente a lo largo de tu juego actual y otros proyectos. Además, puedes realizar fácilmente ediciones a un paquete que se propagan instantáneamente a todas sus instancias, ahorrándote mucho tiempo en el proceso de iteración.

Dado que tus objetos SurfaceAppearance ya son paquetes, cuando conviertes tus objetos Model en paquetes, se convierten en paquetes anidados. Los paquetes anidados te permiten mantener jerarquías complejas de objetos hijos que puedes modificar independientemente del paquete de objeto Model. Esto te brinda un mayor control sobre los componentes individuales de tus activos.

Para convertir tus activos modulares y props en paquetes:

  1. En la ventana de Explorer, haz clic derecho en un activo modular o un prop, luego selecciona Convertir a Paquete del menú contextual. Se muestra el diálogo Convertir a Paquete.

  2. Completa los campos Título y Descripción, establece la propiedad de propiedad en ti mismo o en un grupo, luego haz clic en el botón Enviar. Una vez completado, un símbolo de cadena se muestra sobre el ícono del modelo para identificarlo como un paquete.

    El ícono del Modelo con un símbolo de cadena.
  3. Repite este proceso para cada activo modular y prop.

Una vez que estés satisfecho con el diseño general de tu biblioteca de activos, puedes pasar a decorar el entorno con tus activos recién pulidos y configurar elementos adicionales del espacio 3D para dar vida a tu mundo.

©2026 Roblox Corporation. Roblox, el logotipo de Roblox y "Powering Imagination" son algunas de nuestras marcas registradas y no registradas en los Estados Unidos y otros países.