Qué es mutable
Mutable es un conjunto de herramientas para Unreal Engine que genera mallas esqueléticas dinámicas, materiales y texturas en el editor o en tiempo de ejecución. Está diseñado para ayudar a artistas y diseñadores a crear sistemas de personalización de personajes, pero puede generar una variedad de contenido dinámico, como animales, elementos y otros recursos de malla esquelética.
Aunque Mutable está diseñado para funcionar de forma eficiente en el juego, también es útil como herramienta de canalización de contenido para proyectos que requieren la flexibilidad de crear muchas variaciones de mallas esqueléticas dentro de Unreal Editor.
Mutable está diseñado para:
Admitir una personalización profunda que implica muchos parámetros y capas de textura.
Dar soporte a interacciones de malla complejas.
Admitir efectos de textura que no sean de alto rendimiento para GPU, como proyecciones envolventes y muchas proyecciones planas.
Optimizar el uso de la memoria.
Reducir los costes de los sombreadores.
Reducir el recuento de llamadas de trazado.
El uso de Mutable traslada parte del coste de CPU y memoria a la generación del personaje. Los personajes se generan en segundo plano usando algunos recursos de la CPU y la memoria de trabajo. Una vez generados, solo usarán los recursos de una malla esquelética pregenerada.
Funciones de Mutable
Mutable contiene las siguientes funciones:
General
Los sistemas de parámetros flexibles conectan objetos personalizables con múltiples efectos.
Divide los personajes personalizables en múltiples recursos para facilitar el trabajo simultáneo de los artistas.
Malla
Elimina las partes ocultas para maximizar el rendimiento y evitar la interferencia entre texturas.
Hace bake de transformaciones en el momento de generar el personaje.
Fusiona mallas para reducir las llamadas de trazado.
Deforma las mallas en función de las interacciones entre las partes del personaje.
Texturas
Hace bake de imágenes de textura en tiempo de ejecución combinando múltiples efectos.
Admite varios tipos de proyectores: planos, cilíndricos y envolventes.
Admite múltiples modos de fusión de texturas: multiplicación, luz suave, luz dura, quemado, sobreexposición, etc.
Gestiona las disposiciones de UV para eliminar de forma dinámica las partes de textura innecesarias.
Animación y física
Combina grafos de animación de varias partes.
Fusiona y deforma los recursos de física de colisión junto con las mallas.
Gestiona los datos de simulación de la tela durante la generación del personaje.
Rendimiento
Crea instancias flexibles de personajes personalizados.
Admite la gestión de LOD en tiempo de ejecución.
Admite varios estados para adaptar la generación de personajes a distintos casos de uso.
Admite la transmisión de texturas con generación a la carta.
Objetos y actores personalizables
El siguiente diagrama muestra cómo se usan las mallas, las texturas y los materiales para la personalización de personajes. Los conceptos principales del sistema son los recursos CustomizableObject, los recursos CustomizableObjectInstance y los actores con componentes especiales que usan estos recursos.
Mutable usa recursos CustomizableObject, recursos CustomizableObjectInstance y actores con componentes especiales para crear los recursos finales.
Objetos personalizables
Los objetos personalizables son un nuevo tipo de recurso añadido a Unreal Engine y representan un objeto que se puede personalizar usando Mutable. Incluye todas las variaciones posibles que se le puedan aplicar. Define los parámetros que el jugador o el código del juego controlan en tiempo de ejecución y cómo afectan a los objetos finales.
Puedes crear objetos personalizables desde el almacén de contenido o el explorador de contenido usando el menú Añadir nuevo:
Creación de un objeto personalizable.
Parámetros
Un objeto personalizable contiene varios parámetros que puedes modificar en tiempo de ejecución. Hay varios tipos de parámetros:
Parámetros de control deslizante: parámetros numéricos con decimales, que oscilan entre 0.0 y 1.0. Por lo general, los crea explícitamente un Node-Float-Parameter y se usan para efectos continuos, como efectos de textura o transformaciones de malla.
Parámetros de enumeración: representa una opción dentro de un conjunto predefinido de opciones. Estos pueden crearse con un Node-Object-Group, para seleccionar un objeto hijo, o con un Node-Enum-Parameter, para elegir una opción o múltiples Node-Switch.
Parámetros de casilla de verificación: representa dos posibilidades, habilitado o deshabilitado. Los crea un Node-Object-Group cuando el tipo de grupo es «Habilitar/deshabilitar cada ajuste».
Parámetros de color: representa un color con canal alfa mediante un vector de cuatro valores numéricos float, con un intervalo entre 0.0 y 1.0. Los crea Node-Color-Parameter.
Parámetros del proyector: representa un proyector con una posición que se puede modificar en tiempo de ejecución. Se crean con Node-Projector-Parameter.
Personalizable Objeto Instancia
La instancia de objeto personalizable es un nuevo tipo de recurso que se usa con Mutable. Representa una instancia de un objeto CustomizableObject, un conjunto de valores de parámetro que se aplican a un objeto CustomizableObject para crear un recurso personalizado. Por ejemplo, si tienes un CustomizableObject para Bandits, cada bandido único que crees a partir de él será una CustomizableObjectInstance.
Para crear un recurso de instancia a partir de un objeto personalizable, haz clic derecho en el objeto personalizable y selecciona Crear nueva instancia:
Creación de una nueva instancia de objeto personalizable.
Editores de Mutable
Personalizable Objeto Editor
Al hacer doble clic en un objeto personalizable, se abre el editor de objetos personalizables:
El editor de objetos personalizables.
La interfaz contiene los siguientes paneles:
Grafo fuente: contiene los nodos de blueprint que definen la estructura del CustomizableObject, incluidos los ajustes de LOD, las secciones de malla, las mallas, las texturas, los parámetros y los efectos que los conectan.
Propiedades del objeto: contiene las propiedades generales del objeto.
Propiedades del nodo: contiene las propiedades del nodo seleccionado.
Previsualizar visor de instancias: muestra la vista previa en 3D cuando se abre y compila un objeto.
Previsualizar parámetros de instancias: muestra los parámetros actuales del objeto de vista previa. Se pueden modificar directamente aquí. También puedes hacer bake de la instancia actual en un conjunto de recursos estándar de Unreal Engine. Consulta Cómo hacer bake de instancias para obtener más información.
La barra de herramientas del editor contiene los siguientes elementos:
Guardar: guarda el objeto actual.
Compilar: compila el objeto actual con todos sus hijos y actualiza la vista previa. Esto es necesario para reflejar los cambios en el grafo. Para obtener más información sobre la compilación y sus opciones, consulta la sección Ajuste del rendimiento.
Compilar solo la selección: compila solo el objeto actual y los hijos previsualizados. Esto es útil para iterar más rápido cuando el objeto personalizable es muy grande.
Analizador de memoria de textura: abre un panel de herramientas que muestra las texturas resultantes del objeto de vista previa y sus detalles, como el tamaño final, el formato y el uso de memoria.
Analizador de rendimiento: abre un panel de herramientas que compara el objeto actual generando muchas instancias aleatorias y mostrando muchas métricas relevantes, como la cantidad de triángulos o el tiempo de generación.
Personalizable Objeto Instancia Editor
El editor de instancias de objetos personalizables se usa para ver y modificar instancias de objetos personalizables. Tiene solo dos paneles y son similares a los paneles de propiedades de vista previa y de nodos en el editor de objetos personalizables.
Jerarquía de objetos
Objetos
Mutable organiza cada objeto personalizable en una jerarquía. Cada objeto tiene un nodo raíz que se conecta a todos los demás nodos. Estos nodos representan componentes, mallas, materiales, texturas y parámetros. Cualquier objeto puede tener cualquier número de objetos hijo. Un hijo puede:
Añadir nuevas mallas y secciones de malla al objeto final.
Extender una malla ya presente en otro objeto
Eliminar parte de la malla de otro objeto.
Parchear las texturas de un material en otro objeto
Activar etiquetas definidas por el usuario que pueden usarse en objetos relacionados para aplicar distintos efectos.
Al mismo tiempo, los objetos hijo pueden tener sus propios objetos hijo en una jerarquía ilimitada.
Grupos
Los objetos hijo se pueden organizar en Grupos. Los grupos definen la lógica entre el objeto y su padre en cuanto a cómo se activan los objetos hijo. Por ejemplo, todos los hijos de la camiseta se pueden agrupar con un parámetro de objeto que solo permite a los usuarios seleccionar una a la vez o ninguna.
Aquí tienes dos objetos hijo conectados a través de un grupo:
Cada grupo tiene un tipo que puede ser uno de los siguientes:
Alternar: los objetos hijo aparecen como opciones que pueden habilitarse y deshabilitarse.
Al menos una opción: debe seleccionarse un único objeto hijo.
Ninguno o uno: se puede seleccionar un solo objeto hijo.
Todas las opciones: todos los hijos del objeto están activos todo el tiempo. Se comporta como si los hijos se conectaran directamente con el padre.
Componentes de actor
Un solo CustomizableObject puede generar múltiples componentes de actor. Los parámetros pueden afectar a varios componentes a la vez, pero también puedes habilitarlos o deshabilitarlos de forma condicional. Para crear varios componentes, consulta la documentación sobre los nodos de componentes.
Malla esquelética de referencia
Los nodos de componente de malla tienen una propiedad llamada Malla esquelética de referencia. Se trata de una malla esquelética estándar de Unreal Engine y se usa por los siguientes motivos:
Todas las mallas esqueléticas generadas para este componente en instancias de CustomizableObject utilizan las propiedades de la malla esquelética de referencia para todo lo que Mutable no crea ni modifica. Esto incluye datos como distancias de LOD, propiedades de física, volúmenes delimitadores, esqueletos, etc. Cuando se crea una instancia de CustomizableObject por primera vez, se utiliza la malla esquelética de referencia para cada componente de actor. Se puede deshabilitar con la función `SetReplaceDiscardedWithReferenceMeshEnabled` de la clase CustomizableObjectSystem. Para obtener más información, consulta Uso de Mutable desde C++ y Uso de Mutable desde Blueprints.
Por este motivo, los proyectos suelen utilizar una malla esquelética simple o genérica como malla esquelética de referencia. Una opción es reemplazar la malla esquelética de referencia por una malla esquelética a la que se le ha hecho bake generada en el editor, con el aspecto genérico deseado. Consulta la sección Cómo hacer bake de instancias para obtener más información.
Múltiples recursos
Un objeto CustomizableObject grande se puede dividir en varios recursos. Esto es importante cuando varios usuarios estáis trabajando en los mismos datos y para el control de versiones. Existen dos funciones que te ayudarán con esto:
Los objetos hijo se pueden seleccionar como padre de un grupo de objetos en un recurso distinto, en lugar de conectarlos directamente en un grafo. Consulta la documentación de los nodos Object Group y Child Object para obtener más información.
Hay nodos de diagrama especiales para exportar e importar conexiones desde el grafo en otros recursos.
Esto es útil para los datos del editor, pero no tiene nada que ver con la transmisión de datos en juegos empaquetados. La transmisión de datos para juegos empaquetados se produce independientemente de si el objeto CustomizableObject se divide en varios recursos o no.
Interacciones de los objetos
Mutable tiene varias funciones para gestionar las interacciones de los objetos. Una de ellas es Grupos de objetos, que crea parámetros de instancias que seleccionan solo un objeto hijo de un conjunto, por lo que no es posible añadir más de uno. Un ejemplo de esto es un grupo de sombreros de personaje, que te permitirá seleccionar un sombrero o ninguno, pero nunca dos.
Además, Mutable tiene un sistema para crear distintas variaciones de un objeto en función de qué otros objetos se añaden a una instancia. Por ejemplo, tienes un personaje con varios peinados y sombreros. Puede que quieras crear variaciones para algunos de los peinados que se usarán cuando el personaje también lleve un tipo de sombrero. Para ello, puedes usar nodos Mesh Section Variations y otros nodos Variation.
Otro ejemplo de interacción de objetos es la eliminación selectiva de fragmentos de malla de un objeto usando modificadores que existen en otro objeto.
Estos dos tipos de interacciones de objetos utilizan el sistema de etiquetas. Puedes definir tus propias etiquetas y activarlas cuando un objeto esté activo en una instancia. El nodo Mesh Section es donde puedes añadir etiquetas. Además, hay varios nodos que actúan de forma distinta en función de las etiquetas de una instancia concreta, como Mesh Section Variation o el nodo Clip Mesh With Mesh Modifier.
Diseños de texturas
Mutable puede fusionar mallas y secciones de malla de varios objetos en una sola malla. También puedes eliminar fragmentos de malla de mallas existentes. Al hacerlo, Mutable modificará la disposición de UV de las texturas para optimizar el uso de la memoria y minimizar los comandos de renderizado. Mutable hará esto automáticamente por defecto, pero puedes hacerlo manualmente a través de varias propiedades en el nodo Skeletal Mesh y el nodo Table.
Consulta la sección Disposiciones de texturas para obtener más información.
Estados
Un estado representa un caso de uso específico en el juego (como en propio juego, personalización de telas, personalización facial, etc.) y se puede configurar con un conjunto de parámetros que Mutable tendrá listos para modificar. Los estados se usan para optimizar las actualizaciones de las instancias. Por ejemplo, se puede optimizar un estado para los cambios de rostro, otro para los de cuerpo, otro para los tatuajes y otro para solo las cosas que pueden cambiar durante el juego. Al usar estados, el tiempo de actualización del personaje puede ser mucho más rápido cuando solo se cambian los parámetros que están optimizados en el estado que has seleccionado para el personaje.
Para obtener más información, consulta la página Estados.
Transmisión
La transmisión de datos de Mutable es importante para reducir el uso de memoria. Un personaje personalizable puede tener cientos de opciones y partes de personalización. Sin la transmisión de datos, tendrían que cargarse del disco a la memoria al mismo tiempo, consumirían muchos GB de RAM y llevaría mucho tiempo. Mutable transmite solo las partes que se están usando, reduciendo así considerablemente el consumo de memoria y los tiempos de carga. Además, una parte se descarga cuando ya no se usa.