O que é o Mutable
O Mutable é um conjunto de ferramentas para Unreal Engine que gera malhas esqueléticas dinâmicas, materiais e texturas no editor ou em tempo de execução. Ele foi projetado para ajudar artistas e designers a criar sistemas de personalização de personagens, mas pode gerar uma variedade de conteúdo dinâmico, como animais, adereços e outros ativos de malha esquelética.
O Mutable foi projetado para ser executado de maneira eficiente no jogo. No entanto, também é útil como ferramenta de pipeline de conteúdo para projetos que exigem flexibilidade para criar muitas variações de malhas do esqueleto dentro do Unreal Editor.
O Mutable foi projetado para:
Permite personalização detalhada envolvendo muitos parâmetros e camadas de textura.
Permitem interações complexas de malha.
Permite efeitos de textura que não dependem da GPU, como projeções envolvendo e muitas projeções planas.
Otimização do uso de memória
Reduz os custos de shader.
Reduza a contagem de draw call.
O uso do Mutable translada parte do custo de CPU e memória no momento da geração do personagem. Os personagens são gerados em segundo plano usando alguns recursos da CPU e da memória e usarão apenas os recursos de uma malha do esqueleto pré-gerada após a geração.
Funcionalidades do Mutable
O Mutable contém os seguintes recursos:
Geral
Sistemas de parâmetros flexíveis conectam objetos personalizáveis com vários efeitos.
Divide personagens personalizáveis em vários ativos para facilitar o trabalho simultâneo de artistas.
Malha
Remove partes ocultas para maximizar o desempenho e evitar z-fighting.
Incorpora transformações no momento da geração do personagem.
Mescla malhas para reduzir draw calls.
Deforma malhas com base em interações entre partes do personagem.
Texturas
Incorpora texturas incorporadas em tempo de execução, combinando vários efeitos.
Oferece suporte a vários tipos de projetores: planar, cilíndrica e envolvente.
Oferece suporte a vários modos de mesclagem de texturas: multiplicação, luz suave, luz dura, queimadura, subexposição etc.
Gerencia layouts de UV para remover dinamicamente partes de textura desnecessárias.
Animação e física
Combina gráficos de animação de várias partes.
Mescla e deforma ativos de física de colisão com as malhas.
Gerencia dados de simulação de tecido na geração de personagem.
Desempenho
Instância flexível de personagens personalizados.
Permite gerenciamento de LOD em tempo de execução.
Permite vários estados para ajustar a geração de personagem a diferentes casos de uso.
Permite transmissão de texturas com geração sob demanda.
Objetos e atores personalizáveis
O diagrama a seguir mostra como malhas, texturas e materiais são usados na personalização de personagens. Os principais conceitos do sistema são ativos "CustomizableObject", ativos "CustomizableObjectInstance" e atores com componentes especiais que usam esses ativos.
O Mutable usa os ativos "CustomizableObject", "CustomizableObjectInstance" e atores com componentes especiais para criar os ativos finais.
Objetos personalizáveis
Objetos personalizáveis são um novo tipo de ativo adicionado à Unreal Engine e representam um objeto que pode ser personalizado usando o Mutable. Inclui todas as variações possíveis que podem ser aplicadas a ele. Ele define os parâmetros que são controlados em tempo de execução pelo jogador ou código do jogo e como eles afetam os objetos finais.
Você pode criar Objetos personalizáveis pela Gaveta de Conteúdo ou Navegador de Conteúdo usando o menu Adicionar Novo:
Criando um objeto personalizável.
Parâmetros
Um Objeto personalizável contém vários parâmetros que podem ser modificados em tempo de execução. Existem vários tipos de parâmetros:
Parâmetros da barra de controle deslizante: parâmetros numéricos com decimais, variando entre 0,0 e 1,0. Em geral, são criados explicitamente por um Node-Float-Parameter e usados para efeitos contínuos, como efeitos de textura ou morfos de malha.
Parâmetros de enumeração: representa uma opção em um conjunto predefinido de opções. Eles podem ser criados por um Node-Object-Group, para selecionar um objeto filho, ou por um Node-Enum-Parameter, para escolher uma ou várias opções de Node-Switch.
Parâmetros de caixas de seleção: representa duas possibilidades, habilitada ou desabilitado. Eles são criados por um Node-Object-Group quando o tipo de grupo é "Alternar cada".
Parâmetros de cor: representa uma cor com canal alfa usando um vetor de quatro valores Float numéricos, variando entre 0,0 e 1,0. Elas são criadas pelo Node-Color-Parameter.
Parâmetros de projetor: representa um projetor com uma posição que pode ser modificada em tempo de execução. Eles são criados com Node-Projector-Parameter.
Instância de objeto personalizável
A Instância de objeto personalizável é um novo tipo de ativo usado com o Mutable. Ele representa uma instância de um CustomizableObject, um conjunto de valores de parâmetro a serem aplicados a um CustomizableObject para criar um ativo personalizado. Por exemplo, se você tiver um CustomizableObject para bandidos, cada bandido único criado a partir dele será um CustomizableObjectInstance.
Para criar um ativo de instância a partir de um Objeto personalizável, clicar com o botão direito no Objeto personalizável e selecione Criar nova instância:
Criando uma nova instância de objeto personalizável.
Editores Mutable
Editor de objetos personalizável
Clicar duas vezes em um Objeto personalizável abre o Editor de objetos personalizável:
O Editor de objetos personalizável.
A interface contém os seguintes painéis:
Gráfico de origem: contém os nós de Blueprints que definem a estrutura do CustomizableObject, incluindo suas configurações de LOD, segmentos de malha, malhas, texturas, parâmetros e os efeitos que os conectam.
Propriedades do objeto: contém as propriedades gerais do objeto.
Propriedades do nó: contém as propriedades do nó selecionado.
Janela de visualização de instância de pré-visualização: mostra a pré-visualização 3D quando um objeto é aberto e compilado.
Parâmetros da instância de pré-visualização: mostra os parâmetros atuais do objeto de pré-visualização. Eles podem ser modificados diretamente aqui. Ele também pode "incorporar" a instância atual em um conjunto de ativos padrão da Unreal Engine. Consulte Incorporação de instâncias para obter mais detalhes.
A barra de ferramentas do editor contém os seguintes elementos:
Salvar: salva o objeto atual.
Compilar: compila o objeto atual com todos os filhos e atualiza a pré-visualização. Isso é necessário para refletir as alterações no gráfico. Para obter mais informações sobre a compilação e suas opções, consulte Ajuste de desempenho.
Compilar somente selecionados: compila o objeto atual e apenas os filhos pré-visualizados. Isso facilita a iteração quando o objeto personalizável é muito grande.
Analisador de memória de textura: abre um painel de ferramenta que mostra as texturas resultantes do objeto de pré-visualização e seus detalhes, como tamanho final, formato e uso de memória.
Analisador de desempenho: abre um painel de ferramenta que compara o objeto atual gerando muitas instâncias aleatórias e mostrando muitas métricas relevantes, como contagem de triângulo ou tempo de geração.
Editor de instância de objeto personalizável
O Editor de instância de objeto personalizável é usado para visualizar e modificar instâncias de CustomizableObject. Ele tem apenas dois painéis e é semelhante aos painéis Pré-visualização e Propriedades do nó no Editor de objeto personalizável.
Hierarquia de objetos
Objetos
Mutable organiza cada Objeto personalizável em uma hierarquia. Cada objeto tem um nó-raiz que se conecta a todos os outros nós. Esses nós representam componentes, malhas, materiais, texturas e parâmetros. Qualquer objeto pode ter qualquer número de objetos filho. Um filho pode:
Adicionar novas malhas e segmentos de malha ao objeto final
Estender uma malha já presente em outro objeto
Remover parte da malha em outro objeto
Remendar as texturas de um material em outro objeto
Ative tags definidas pelo usuário que podem ser usadas em objetos irmãos para aplicar efeitos diferentes.
Por sua vez, objetos filho podem ter objetos filho em uma hierarquia ilimitada.
Grupos
Objetos filhos podem ser organizados em Grupos. Grupos definem a lógica entre o objeto e seu pai em relação ao modo como os objetos filho são ativados. Por exemplo, todos os filhos de camisetas podem ser agrupados com um parâmetro de objeto que permite que os usuários selecionem apenas um deles por vez, ou nenhum.
Estes são dois objetos filho conectados por um grupo:
Cada grupo tem um tipo de grupo, que pode ser um dos seguintes:
Alternância: os objetos filho aparecem como opções alternáveis.
Pelo menos uma opção: um único objeto filho deve ser selecionado.
Nenhum ou um: um único objeto filho pode ser selecionado.
Todas as opções: todos os filhos do objeto estão ativos o tempo todo. Comporta-se como se os filhos se conectassem diretamente ao pai.
Componentes de ator
Um único CustomizableObject pode gerar vários Componentes de Ator. Os parâmetros podem afetar vários componentes ao mesmo tempo, mas também podem alterná-los condicionalmente. Para criar vários componentes, consulte a referência de nós de componentes.
A malha esquelética de referência
Nós de componente de malha têm uma propriedade chamada Malha do esqueleto de referência. É uma malha esqueleto padrão da Unreal Engine e é usada pelos seguintes motivos:
Todas as malhas de esqueleto geradas para este componente em instâncias CustomizableObject usam as propriedades da malha de esqueleto de referência para tudo que o Mutable não cria ou modifica. Isso inclui dados como distâncias LOD, propriedades físicas, volumes delimitadores, esqueleto, etc. Quando uma instância CustomizableObject está sendo criada pela primeira vez, a Malha do esqueleto de referência é usada para cada Componente de Ator. Isso pode ser desabilitado usando a função "SetReplaceDiscardedWithReferenceMeshEnabled" da classe CustomizableObjectSystem. Para obter mais informações, confira Uso de Mutable a partir de C++ e Uso de Mutable a partir de Blueprints.
Por esse motivo, os projetos costumam usar uma malha do esqueleto simples ou genérica como a Malha do esqueleto de referência. Uma opção é substituir a Malha do esqueleto de referência por uma malha do esqueleto incorporada gerada no editor, com a aparência //generic// desejada. Confira Como incorporar instâncias para obter mais informações.
Vários ativos
Um CustomizableObject grande pode ser dividido em vários ativos. Isso é importante quando vários usuários estão trabalhando nos mesmos dados e para o controle de versão. Existem 2 funcionalidades para ajudar com isso:
Objetos filhos podem ser selecionados como pai de um grupo de Objeto em um ativo diferente, em vez de conectá-los diretamente em um gráfico. Confira a referência de nó Grupo de objetos e Objeto filho para obter mais informações.
Há nós de diagrama especiais para exportar e importar conexões do gráfico em outros ativos.
Isso é útil para dados do editor, mas não tem nada a ver com transmissão de dados em jogos em pacotes. A transmissão de dados para jogos em pacotes ocorre independentemente de o CustomizableObject estar dividido em vários ativos ou não.
Interações de objeto
O Mutable tem várias funcionalidades para lidar com interações de objeto. Um é Grupos de objetos, que criam parâmetros de instância que selecionam apenas um objeto filho de um conjunto. Portanto, não é possível adicionar mais que um deles. Um exemplo disso é um grupo para chapéus de personagem, que permite selecionar um ou nenhum chapéu, mas nunca dois.
Além disso, o Mutable tem um sistema para criar diferentes variações de um objeto com base em outros objetos adicionados a uma instância. Por exemplo, você tem um personagem com vários penteados e chapéus. Você pode criar variações para alguns dos penteados a serem usados quando um tipo de chapéu também estiver presente no personagem. Você pode usar as variações da Seção da malha e outros nós de variação para isso.
Outro exemplo de interação de objeto é a remoção seletiva de fragmentos de malha de um objeto usando modificadores que existem em outro objeto.
Esses dois tipos de interação de objeto usam o sistema de tags. Você pode definir suas próprias tags e habilitá-las quando um objeto estiver ativo em uma instância. O nó Malha segmentada é onde você pode adicionar tags. Há vários nós que agem de maneira diferente com base nas tags, etiqueta em uma instância específica, como o nó Variação de segmentação de malha ou o nó Recortar malha com modificadores de malha.
Layouts de textura
O Mutable pode combinar malhas e segmentos de malha de vários objetos em uma única malha. Ele também pode remover fragmentos de malha existentes. Ao fazer isso, o Mutable modificará os layouts de textura UV para otimizar o uso da memória e minimizar os comandos de renderização. Por padrão, o Mutable faz isso de forma automática, mas o controle manual está disponível por meio de várias propriedades no Nó da malha do esqueleto e do Nó da tabela.
Confira Layouts de textura para obter mais informações.
Estados
Um estado representa um caso de uso específico no jogo (como no jogo, personalização de tecido, personalização facial, etc.) e pode ser configurado com um conjunto de parâmetros que o Mutable terá prontos para modificação. Estados são usados para otimizar as atualizações de instância. Por exemplo, um estado pode ser otimizado para alterações na face, outro estado para alterações no corpo, outro estado para tatuagens e outro apenas para as coisas que podem mudar durante a jogabilidade. O uso de estados significa que o tempo de atualização do personagem pode ser muito mais rápido ao alterar apenas os parâmetros otimizados no estado selecionado para o personagem.
Consulte a página Estados para obter mais informações.
Transmissão
A transmissão de dados do Mutable é importante para reduzir o uso de memória. Um personagem personalizável pode ter centenas de opções e partes de personalização. Sem o streaming de dados, eles teriam que ser carregados do disco na memória ao mesmo tempo, usariam muitos GBs de RAM e isso levaria muito tempo. Streams Mutable transmitem apenas as partes que estão sendo usadas, reduzindo muito o consumo de memória e os tempos de carregamento. Além disso, uma peça é descarregada quando não é mais usada.