Quais as novidades?
O lançamento da Unreal Engine 5.7 traz mais melhorias para o conjunto de ferramentas da UE5. Este lançamento implementa melhorias em uma ampla gama de áreas, incluindo renderização, personagens e animação, criação de mundos, PCG e muito mais.
Este lançamento inclui melhorias enviadas por nossa própria comunidade de desenvolvedores da Unreal Engine no GitHub. Agradecemos a cada uma dessas pessoas que contribuiu para a Unreal Engine 5.7:
AlexanderVeselov-arm, AlexBlackfrost, Almax27, andreibazi, az6667, Bit-Rot, Brian-PD, brpendle-ti, bturner, chrysos8201, ckendal3, ColinGulliver, CookiePLMonster, Darcy3000s, dasherman-ea, davidbaack, dmergele, DoubleDeez, DrewWeth, DTG-Will-Marshall, dyanikoglu, erebel55, Eric2-Praxinos, Erlandys, faisa-believer, foobit, gamethread, geordiemhall, glecko, GreenLightning, guansdu, H3mul, IngSubstance, iniside, jamesfAnet, jamespark-unreal, JasonCoombs, jdamdami, jerobarraco, jeysym, Jiboo, JohnJFarrow, Jordonbc, jorge-axiomvfx, jorgenpt, jpritchard1010, KaosSpectrum, KarimLUCCIN, KeithRare, kimkun07-k, kissSimple, klukule, KXOC, laurencei, lclara-BARB, LHG-JonAnderJimenez, ligazetom, LightKL, lsandersljungberg, LucaFranzo98, Maigo, MarcusSvensson92, Mario-Azcona, MartinWickhamFB, Mattiwatti, melku, michael-buschbeck-ms, Minus4-44, moumee, nickdarnell, phochstrasser, PICO-XR, QRare, r457-Ao2, rdunnington, reduf, redxdev, RiotJDebern, rohyunsang, sareali, serhanio, SilverWinter0511, slonopotamus, SoulSharer, sportbikerr1, ssutherland-riot, SukenderDontNod, Sythenz, teddemunnik, tioez326, tokyocplusplus, Tt-Wes, tustanivsky, Vaei, vladbelousoff, vogoltsov, WangKan, Wizzard033, wmiller, x157, yangskyboxlabs, yoonbigbear, zachlute-arenanet, ZeroEightSix, ZeroErrors, zhou-
Renderização
MegaLights (Beta)
O MegaLights já está na versão Beta, com melhorias na redução de ruído e no desempenho geral. Assim, também oferece suporte para os seguintes recursos:
"Luz direcional"
Luzes de Partículas do Niagara
Translucidez
Fios de cabelo
Volumes heterogêneos do Niagara
Os Volumes Heterogêneos já estão na versão Beta. Esta atualização se dedica às melhorias na projeção de sombras com as seguintes novas funcionalidades:
Sombras em cascata para a luz direcional.
Suporte a mapa de sombra de Beer, proporcionando escalabilidade da Epic, que oferece:
Tempo de criação de sombras drasticamente melhorado.
Consulta de sombras em tempo constante.
Pré-passagem da máscara de sombra, que reduz a pressão adicional de VGPR na iluminação diferida.
Habilitar a projeção de sombras não exige mais o reinício do editor nem a compilação de shaders.
Substrate
Os Materiais de Substrate, que ficam prontos para produção e habilitados por padrão a partir da UE 5.7, representam uma estrutura de materiais modular e fisicamente fundamentada que substitui os modelos de sombras fixos por um sistema projetado para controle expressivo, desempenho escalonável e flexibilidade a longo prazo.
Eles são compatíveis com dois caminho de renderização:
O GBuffer Adaptativo, que permite funcionalidades avançadas, como topologia por pixel e fechamentos em camadas em hardwares modernos.
E o GBuffer Mesclável, uma alternativa simplificada que garante uma compatibilidade ampla com diferentes plataformas.
Folhagem e Revestimento do Nanite (experimental)
A Folhagem do Nanite é um caminho de renderização líder do setor, que, em sua essência, é composto por três sistemas integrados:
As Montagens do Nanite, que gerenciam as instâncias de partes da folhagem como uma unidade coesa.
O Revestimento do Nanite, que determina o comportamento dinâmico que ocorrerá com sistemas como o vento.
E os Voxels do Nanite, que são voxels do tamanho de pixels capazes de reter detalhes, animação e características de materiais de acordo com a distância da câmera, tudo a uma fração do custo original.
Quando combinados, é possível criar mundos mais robustos com folhagens realistas e animadas, que podem ser entregues dentro de uma meta de 60 FPS em hardwares de última geração.
Novas funcionalidades:
Montagens do Nanite, para criar ativos de folhagem usando partes instanciadas, mantendo os tamanhos dos ativos reduzidos.
API Blueprint para criar montagens do Nanite.
Além de ferramentas no editor para facilitar a criação de montagens do Nanite a partir de seleções.
Suporte de importação para USD. Esquemas USD expostos para uso em ferramentas de criação de conteúdo digital, permitindo a marcação de cenas para importação como montagens.
Vento dinâmico controlado por malha do esqueleto; as árvores são malhas do esqueleto e o novo plugin Dynamic Wind permite que o vento procedural afete seus ossos.
Voxels do Nanite, para renderizar eficientemente a geometria de folhagem à distância.
Detecção de geometria fina da TSR para lidar melhor com folhagens.
SMAA (experimental)
Os renderizadores para dispositivos móveis e desktop agora oferecem suporte a SMAA (Subpixel Morphological Anti-Aliasing). É possível ativá-lo no renderizador para dispositivos móveis usando o CVAR r.Mobile.AntiAliasing=5, e no renderizador desktop usando o CVAR
r.AntiAliasingMethod=5.
Essa funcionalidade melhora a fidelidade visual fornecendo suavização de bordas de alta qualidade com impacto mínimo no desempenho, sendo uma técnica eficiente para jogos em dispositivos móveis.
O antisserrilhado SMAA está habilitado em todas as plataformas.
Ajuste as configurações de qualidade usando
r.SMAA.Quality.Ajuste a detecção de bordas entre cor ou luminância usando
r.SMAA.EdgeMode.Melhore a suavidade das bordas sem exigir demais da GPU.
Atualmente, esse é um recurso experimental. As configurações de qualidade permitem ajustar o equilíbrio entre desempenho e fidelidade visual.
Personagem e Animação
Integração do seletor de correspondência de movimento (experimental)
Na UE 5.7, lançamos nossa primeira iteração da correspondência de movimento integrada aos seletores! Estamos fazendo isso porque permite que os usuários controlem quais ativos são válidos para seleção na correspondência de movimento, algo que, em versões anteriores, só era possível no nível do banco de dados, e não no nível de cada ativo individual.
Assim, você pode buscar a melhor pose, mas também filtrar os resultados por ativo com base em condições extras, como lógica de jogo, por meio do seletor.
Um novo campo Pose Search nos seletores gerencia essa complexidade, juntamente com a depuração integrada da correspondência de movimento nos seletores.
Essa é uma funcionalidade experimental.
Ferramentas de blendshapes e escultura
Leve a flexibilidade dos fluxos de trabalho de escultura padrão da indústria para a Unreal Engine. Essa é uma atualização das ferramentas do editor de malha esquelética, que agora permite a criação e edição de formas de transformação, ossos e pesos de revestimento de forma contínua.
Transite instantaneamente entre posicionamento de ossos, preenchimento de pesos e escultura de blendshapes em uma malha esquelética.
Novo visualizador de alvo de transformação.
As formas se adaptam às mudanças na topologia da malha.
Forneça aos animadores ferramentas expressivas para desempenho com qualidade de estúdio.
Colisões de mundo para a física do Control Rig
Leve as colisões do nível para suas simulações de física do Control Rig. Use a geometria existente do mundo e os corpos de física para criar contatos, empurrões e interações realistas.
Suporte a colisão com o mundo na física do Control Rig com interações unidirecionais.
Use malhas de nível e corpos de física como colisores.
Controle o contato com adereços, pisos e o ambiente durante a simulação e a reprodução.
Visualização de dependências do Control Rig
Entenda como os elementos do rig se conectam e se atualizam ao longo do tempo com uma visualização de dependências dedicada. Visualize as relações entre controles, ossos e módulos para simplificar a depuração.
Explore as relações entre pais e filhos e metadados de forma rápida.
Depure rigs e módulos com maior clareza no fluxo de dados.
A visualização de estrutura de dependência familiar.
Desempenho de redirecionamento e CI de corpo inteiro
Adicionamos melhorias de desempenho e controle no CI de corpo inteiro e no redirecionador de CI. Assim, é possível ter redirecionamento eficiente no tempo de execução.
Melhore a pose com CI de corpo inteiro sem um grande custo de desempenho (aumento de velocidade de ~20%).
Use o solucionador de alongamento de membros no rig de CI para redirecionamentos eficientes no tempo de execução.
Use a cópia local do modo de rotação de CD para transferência de rotação mais rápida por cadeia.
Habilite o perfil de desempenho na pilha de redirecionamento.
Adicione um limite de LOD por operador de redirecionamento.
Melhor contato dos pés e redirecionamento proporcional
Melhoramos o redirecionador de CI para obtermos um gerenciamento aprimorado do contato com o solo e de personagens com proporções variadas.
Essa mudança proporciona uma melhor transferência de animação entre uma grande variedade de personagens, permitindo uma direção de arte mais rápida. Veja a seguir tudo que você pode fazer:
Definir a altura da virilha para evitar que a pélvis colida com o solo, e manter o movimento vertical.
Adicionar a restrição de piso aos pés para manter a posição vertical quando próximos do piso.
Use o modo de translação de CD de orientação e dimensionamento para transferir os dados de translação dos ossos.
Adicionar o operador Cadeia de estiramento para corresponder à cadeia de redirecionamento da origem ou dimensioná-la.
Usar o solucionador de extensão de membro para controlar a dobra e a extensão dos membros.
Alterar o pivô da escala de origem para um osso diferente para captura de movimento ou jogabilidade.
Adicionar o operador de filtragem de ossos para remover ruído de alta frequência durante o redirecionamento em personagens maiores.
Redirecionamento com consciência espacial (experimental)
O redirecionamento com consciência espacial oferece uma maneira para os artistas transferirem animações entre diferentes personagens sem se preocuparem com autocolisão.
Isso reduz a necessidade de limpeza da animação após o redirecionamento.
Adicionamos um operador de interações do corpo para forçar os objetivos de CI usando física, evitando a autocolisão.
Adicionamos um operador de CI relativa para mover os objetivos de CI em relação às distâncias de contato entre a origem e o destino.
Validador de Sequência (experimental)
O Validador de Sequência oferece uma forma para os artistas cinematográficos verificarem se há erros de conteúdo em suas sequências. Isso reduz a quantidade de problemas potenciais que podem ocorrer durante a produção ao trabalhar no Sequencer.
Usando ele, você pode:
Enfileirar várias sequências e suas hierarquias para verificar problemas potenciais.
Verificar se seções em uma sequência estão desalinhadas em relação ao corte da câmera ou ao intervalo de reprodução.
Verificar se há vinculações ou ativos não atribuídos nas seções.
Verificar se as seções começam e/ou terminam em quadros inteiros.
Revisar os resultados e navegar diretamente para o local do problema em cada sequência.
Curva de Atenuação (Beta) e melhorias de UX
Agora, você pode usar a ferramenta Atenuação de Curva do design de movimento no Sequencer. Habilite-a usando o plugin Curva de Atenuação.
Além disso, essa atualização adiciona comportamentos mais coesos propiciando melhor usabilidade e permitindo uma iteração mais rápida.
Use a ferramenta de atenuação da curva para aplicar e salvar diferentes predefinições de curva de atenuação no Sequencer, Editor de Curva e UMG
Ajuste a escala de forma semelhante ao painel Detalhes na árvore do Sequencer usando o bloqueio de escala.
Exibição de linha do tempo aprimorada das hierarquias de sequência para mostrar tanto o tempo da sequência atual quanto da sequência pai.
Expanda as capacidades de Blueprint e Python para acessar estados de trilha (Solo, Silenciada, Desativar, Bloquear e Fixar).
Melhorias na gravação de transformações para incluir distorção temporal.
Novas colunas ID de vinculação e ID de sequência adicionadas à ferramenta de navegação.
A ferramenta Atenuação de Curva está atualmente em versão Beta.
Mutável sem dados (experimental)
Acelere a iteração e simplifique o fluxo de trabalho com objetos personalizáveis sem dados. As entradas de parâmetros são processadas no tempo de execução ao invés do tempo de compilação, proporcionando compilações mais rápidas, melhor criptografia e pacotes menores.
Converta qualquer objeto personalizável em uma versão sem dados.
Desfrute de tempos de compilação mais rápidos com o processamento de parâmetros no tempo de execução.
Use criptografia e empacotamento como qualquer outro ativo da UE.
Conjuntos de seleção
Animadores precisam de acesso rápido a várias seleções ao longo de seu processo. O que pode envolver vários controles dentro de um mesmo rig, mas também pode incluir vários controles e/ou transformações em vários ativos. Atualmente, os animadores dependem de ferramentas personalizadas como seletores de GUI para isso, então decidimos criar uma versão mais nativa, semelhante a plugins populares em outras ferramentas.
UX e qualidade de vida no Modo de Animação
Implementamos melhorias no Modo de Animação.
Nossas ferramentas Restrições, Troca de espaço e Snapper agora estão consolidadas em uma nova janela Restrição.
Ainda no que diz respeito a Restrições, adicionamos algumas novas opções ao processo de criação.
Quadro atual: esta é a funcionalidade padrão anterior. Ele cria uma chave LIGADO no quadro atual e compensa todas as chaves à frente.
Do início (novo): usa o deslocamento do quadro atual e o insere no primeiro quadro da sua cena, em vez do quadro atual.
Infinito (novo): não adiciona chaves. Em vez disso, aplica o deslocamento do quadro atual a toda a sequência.
Biblioteca de Poses, ferramentas de interpolação, Restrições, conjuntos de seleção (novo) e camadas de animação agora alternam suas janelas correspondentes ligadas ou desligadas com base no estado do ícone. Sua posição e seu tamanho dentro do layout também ficam salvas.
Você pode atribuir a alternância dessas janelas a teclas de atalho.
MetaHuman
MetaHuman Creator
O MetaHuman Creator na Unreal Engine já está disponível para Linux e macOs, levando toda a poderosa criação de seres humanos digitais integrada para a sua plataforma de preferência. Se você ainda não fez a migração do aplicativo web do MetaHuman Creator, siga nosso guia de migração para obter instruções sobre como levar seu personagem MetaHuman existente para a Unreal Engine para continuar a criar!
Aprimoramos o processo de conformação de malha de corpo com suporte a diversas poses. Além disso, introduzimos correspondência de vértice de espaço UV entre as malhas padrão e modelo de conformidade, permitindo resultados mais precisos com menor esforço. Os controles de corpo paramétricos agora também são mais intuitivos, facilitando que você siga as proporções humanas com maior precisão e controle.
Com esse lançamento você pode automatizar e processar quase todas as operações de edição e montagem para ativos de personagens MetaHumans em lotes com Python e Blueprints. Pela primeira vez, integre mais profundamente o MetaHuman Creator no seu pipeline e fluxo de trabalho criativo com uma API que aceita a modelagem, conformação, figurino, animação esquelética e texturas, agilizando a montagem total de personagens. Pré-visualize edições ao vivo no MetaHuman Creator, execute-as interativamente no Unreal Editor ou em um centro computacional para processamento off-line.
MetaHumans na Unreal Engine
O plugin de groom da Unreal Engine agora permite controles mais refinados na modelagem e animação de fios de cabelo com um fluxo de trabalho baseado em articulações. Agora é possível mesclar simulações e movimento com direção de arte, acessar o uso completo dos fluxos de trabalho de animação de malhas do esqueleto e obter maior liberdade artística com conjuntos de seleção e ferramentas de pintura aprimorados. O conjunto de ferramentas oferece compatibilidade total com grooms de MetaHumans originalmente criados no Houdini.
MetaHuman Animator
A animação em tempo real de fontes de MetaHuman Live Link agora pode ser acessada por meio de uma interface de Blueprint, com um gráfico de exemplo fornecido na documentação.
O fluxo de trabalho para gerar os dados de calibração da tomada de quadriculado (capturada usando um par de câmeras estéreo) foi aprimorado para oferecer melhor seleção automática de quadros, visualização para auxiliar na seleção manual de quadros e configurações repetíveis entre várias tomadas.
Combinado com o novo plugin de diagnóstico de calibração do MetaHuman Animator (experimental) para validar a calibração em relação à filmagem de atuação para determinar mais facilmente se é a melhor calibração a usar.
Captura de MetaHumans
Aperfeiçoamos as opções de animação em tempo real nos aplicativos de iOS e Android do Live Link Face estendendo a variedade de câmeras aceitas.
Com o Live Link Face, você pode gerar animações faciais em tempo real usando uma câmera externa nos dispositivos Android ou iPads aceitos (observação: o iOS da Apple não aceita câmeras externas no momento). O vídeo pode ser gravado de uma câmera externa apenas no iPad.
Você também pode gerar animação em tempo real selecionando dentre quaisquer câmeras internas do dispositivo usando o Live Link Face no iOS ou Android. O vídeo pode ser gravado de uma câmera interna apenas no iOS.
MetaHuman for Houdini
A atualização mais recente do MetaHuman for Houdini apresenta ferramentas de groom paramétrico, um fluxo de trabalho orientado por guia para criação de penteados usando dados com pré-autoria. O conjunto de ferramentas inclui um gerador de folículos para gerenciar a densidade e o posicionamento ao redor da linha do cabelo que gera guias com base em parâmetros de fluxo, comprimento e volume, assim como interpolação de fios de cabelo e estilo para proporcionar detalhamento avançado, como aglomerações. Essa é uma maneira rápida e acessível de bloquear e iterar novos penteados.
Enquanto isso, para quem deseja aprender como criar penteados mais avançados, publicamos o novo MetaHuman Groom Advanced Kit for Houdini na Fab, como um recurso extra de aprendizado.
O MetaHuman for Houdini já está disponível para Linux.
MetaHuman para Maya
A atualização mais recente do MetaHuman for Maya está disponível para Linux e adiciona suporte para Maya 2026.
Criação de Mundos
HLODs personalizados
Ao usar os métodos automáticos de geração de HLOD fornecidos, o resultado pode nem sempre atender aos requisitos do projeto e está vinculado a componentes de malha.
O suporte a HLODs personalizados resolve essa limitação, permitindo fornecer suas próprias representações de HLOD personalizado para atores individuais ou grupos de atores.
Você pode usar a nova classe de ator de HLOD personalizado do World Partition de duas maneiras:
Injetar representação personalizada diretamente: injete a representação personalizada como está na partição de HLOD no tempo de execução e, opcionalmente, use-a como entrada para camadas de HLOD pais.
Fornecer apenas uma fonte personalizada: use a representação personalizada como entrada para o processo de geração de HLOD sem adicioná-la ao mundo propriamente dito.
UX de configuração dos HLODs
Reestruturamos a configuração de camadas HLODs e os ativos de camadas HLODs em Configurações do Mundo, World Partition para aumentar a usabilidade ao criar ou editar uma configuração.
Geração de Conteúdo Procedural (PCG)
O framework de PCG está pronto para produção
O Framework de Geração de Conteúdo Procedural (PCG) já está pronto para produção com o lançamento da UE 5.7.
Embora o framework continue em desenvolvimento e evolução, estamos comprometidos em oferecer um ambiente estável para que todas as produções possam criar e confiar nesse conjunto de ferramentas rápidas e iterativas de geração de conteúdo procedural, tanto para uso em tempo de execução quanto no editor.
Modo de edição de PCG
Um novo modo de ferramenta de edição específico para PCG já está disponível na Unreal Engine. Ele oferece uma biblioteca de ferramentas personalizáveis baseadas no framework de PCG, como desenhar spline, pintar ou criar volume, cada uma com um gráfico de PCG associado e parâmetros disponíveis para edição em tempo real.
Você pode usar os gráficos de PCG específicos das ferramentas fornecidas como estão ou como exemplos para criar e expandir a biblioteca conforme suas próprias necessidades.
Caso tenha usado a prévia da UE 5.7, as configurações do seu modo do editor de PCG podem não ter a configuração padrão. Se a janela do seu modo do editor de PCG não abrir e, ao invés disso, mostrar um erro, abra Plugins — Configurações do modo do editor de PCG nas Preferências do Editor, depois clique em Redefinir como padrão no canto superior direito.
Editor de Vegetação Procedural
O Editor de Vegetação Procedural é um novo plugin experimental para criação e edição de malhas de vegetação, com suporte à folhagem Nanite, diretamente na Unreal Engine.
Nesta versão inicial, os ativos de vegetação procedural que você criar são editados por meio do Editor de Vegetação, um editor de grafos de nós baseado em PCG. Usando o nó de importação fornecido e predefinições de esqueleto disponíveis na pasta de conteúdo do plugin, você pode:
Modificar a forma das árvores por meio dos operadores de gravidade, entalhe e escala.
Ajustar a distribuição de folhas e galhos.
Atribuir diferentes modelos de folhas.
Exportar para uma malha esquelética ou estática, incluindo suporte a conjuntos de folhagem Nanite.
Criar múltiplas variantes por meio de um único ou de vários grafos de nós, a fim de compilar uma biblioteca de malhas de vegetação exclusivas para o projeto.
Fluxos de trabalho de ativos
Já é possível executar grafos de PCG como grafos independentes, eliminando a necessidade do contexto de mundo e de que o grafo seja gerado a partir de um componente de PCG.
Esta alteração adiciona compatibilidade para:
Fluxos de trabalho de criação de ativos, como criar malhas usando operações de geometria, texturas com operações de GPU ou até gerar ativos de dados de PCG, como tabelas de conjuntos de atributos, apenas executando um gráfico de PCG independente.
Ferramentas e plugins de criação de ativos desenvolvidos com base no núcleo do framework de PCG, como o novo Editor de Vegetação Procedural, se beneficiam de todo o conjunto de recursos e de futuras atualizações.
Para habilitar a execução de grafos autônomos de PCG, é possível ativar a nova opção É grafo autônomo, disponível nas configurações de cada grafo. Quando essa opção é habilitada, você tem acesso à função Gerar grafos autônomos no menu de contexto (clique com o botão direito), além da possibilidade de gerar, inspecionar e depurar a partir do editor de grafos usando um objeto de depuração de grafo autônomo.
Tipos de dados personalizados
Desde o lançamento inicial, a lista de tipos de dados compatíveis no framework de PCG era codificada manualmente, o que impedia a adição e o suporte facilitados a novos tipos de dados ao estender o framework ou criar interoperações com plugins externos.
Agora na UE 5.7, é possível adicionar suporte a qualquer tipo de dado personalizado dentro da hierarquia de tipos e expandir o framework, ou usar o núcleo e o conjunto de funcionalidades do framework para criar sua própria ferramenta sobre ele.
O seletor de tipos também foi aprimorado para indicar melhor as relações entre tipos e permitir seleção múltipla.
Tipo de dados Polygon2D e operadores
Adicionamos um novo tipo de dado Polygon2D à lista de tipos de dados compatíveis no framework de PCG.
Os dados Polygon2D são úteis para representar áreas como uma forma fechada, que pode ser convertida em dados de superfícies ou splines, para amostragem ou operações específicas.
Adicionamos um conjunto de novos operadores para oferecer suporte a esse novo tipo de dado:
Criar polígono 2D: recebe como entrada dados de ponto ou spline e os converte em polígonos 2D.
Operações de polígono: permite realizar operações entre polígonos, como interseção, união e diferenças. Além disso, os polígonos 2D podem ser cortados com caminhos, usando splines, para subdividir ou isolar formas. For Por exemplo, cortar uma área maior usando dados de spline em um padrão de grade para criar quarteirões individuais em um grafo gerador de cidade.
Recortar caminhos: permite fazer a interseção ou a subtração de splines de formas poligonais 2D.
Deslocar polígono: aplica um deslocamento ao polígono 2D para aumentá-lo ou reduzi-lo, tratando corretamente as sobreposições.
Criar superfície a partir de Polygon2D: converte o polígono 2D em uma superfície que pode ser amostrada usando o nó Amostrador de Superfície para criar pontos sobre sua área.
Interoperação geométrica rápida por GPU
A GPU da PCG agora utiliza componentes FastGeometry para melhorar ainda mais o desempenho do thread de jogo ao usar o framework para gerar e instanciar uma alta densidade de malhas estáticas, como dispersão de solo e grama. Elimina assim a necessidade de atores de partição e criando componentes de PCG locais dinamicamente.
Para aproveitar essa melhoria, ative o plugin PCG FastGeo Interop em seu projeto e defina o CVAR pcg.RuntimeGeneration.ISM.ComponentlessPrimitives como 1.
Operadores e melhorias de GPU
Novas adições ao conjunto de recursos computacionais por GPU do framework de PCG:
Captura de cena: um novo nó para realizar capturas de cena a partir da origem do componente, obtendo e amostrando a cor ou profundidade da cena para dispersão.
Salvar textura como ativo: um novo nó para incorporar um PCGTextureData em um ativo UTexture2D.
Suporte a substituições: as substituições de parâmetros agora são compatíveis em nós de GPU, incluindo contagens de elementos numéricos (Num Elements) para nós personalizados em HLSL.
Operadores nativos existentes e aprimorados com suporte computacional por GPU:
Selecionar pontos fora de limites de ator
Transformar pontos
Melhorias na UX
Como parte das melhorias contínuas de UX no trabalho com PCG, estas são as alterações mais recentes:
Coloração e validação de tipos de parâmetros e substituições: parâmetros, pins de substituição, pins de saída constante e suas conexões agora são coloridos de acordo com o tipo, correspondendo à linguagem visual de cores dos tipos do Blueprints. Quando uma entrada pode ser de qualquer tipo ou está indefinida, o pin e a conexão usam a cor branca na exibição.
Valores mínimos, máximos e unidades de parâmetros: agora é possível configurar parâmetros do gráfico com valores mínimo e máximo, além de unidades exibidas.
Controles de janelas de visualização de dados: foram adicionados mais controles e opções de visualização de dados ao editor para ajudar na pré-visualização de dados em contextos específicos.
Nó e operadores
A Unreal Engine 5.7 introduz vários elementos nativos de PCG e novas opções, incluindo:
Interseção de splines: encontra splines que se interceptam em 3D e adiciona pontos de controle na interseção ou retorna os pontos de interseção.
Divisão de splines: divide splines em várias outras splines com base em predicados de alfa, distância, chave ou pontos de controle.
Obter segmento: retorna um índice de segmento, ponto ou spline a partir de um ponto, spline ou polígono 2D.
Substituições de geração de componente de malha de spline: a classe de componente agora é respeitada ao gerar a malha de spline, e as substituições de propriedades de componente no nó Spawn Spline Mesh são compatíveis.
Novas classes de elementos de Blueprint de PCG: foram adicionadas novas classes de elementos de PCG, incluindo funções substituíveis baseadas em intervalo para oferecer suporte às alterações de formato "Estrutura da matriz" introduzidas em nós nativos na versão 5.6. O uso desses novos elementos evita transformações de dados extras e melhora o desempenho ao trabalhar com elementos de PCG em Blueprints.
Obter contexto de execução: atualizado com suporte aos contextos É servidor de escuta, Tem autoridade e É compilador.
Extrair atributo: recupera um atributo específico no índice fornecido e o gera como um novo conjunto de atributos.
Exportar atributos selecionados: exporta dados nos formatos binário ou JSON para uso externo, como em aplicações de aprendizado de máquina (ML).
Remapeamento de atributo: agora pode ser controlado por uma curva.
Operadores bit a bit: adicionados os operadores de deslocamento à esquerda (shift left) e à direita (shift right).
Operadores booleanos: adicionados NAND, NOR, XNOR, IMPLY, NIMPLY e conversão automática para booleano a partir de operações bit a bit.
Operadores matemáticos: adicionamos a nova operação "Adicionar módulo", útil para aplicar deslocamento e reordenar índices.
Delimitações a partir da malha e pontos a partir da malha: agora com suporte para malhas esqueléticas.
Plugin de Interoperabilidade com Python
Adicionamos um novo plugin de PCG que fornece um novo nó para executar código Python, permitindo a execução de códigos Python durante a execução dos gráficos. Você pode fornecer o código Python diretamente como entrada ou executá-lo a partir de um arquivo no disco. Também é possível definir o caminho para o arquivo de forma dinâmica, por meio de um atributo ou parâmetro de caminho de objeto flexível e substituível.
Iteração do desenvolvedor
Preparação incremental (Beta)
A preparação incremental está em versão Beta na UE 5.7.
A preparação incremental permite que você faça iterações mais rapidamente nos dispositivos de destino, reduzindo o tempo total de preparação. Os processos de preparação analisam automaticamente as alterações dos ativos em relação à saída armazenada no Zen Server e processam apenas as novas atualizações feitas nos ativos do seu projeto. Isso funciona em todos os ativos nativos da engine, incluindo Blueprints e ladrilhos da World Partition.
Ferramentas C++: suporte ao MSVC 14.44
Na Unreal Engine 5.7, atualizamos o compilador Microsoft Visual C++ padrão para o MSVC 14.44.
Rastreamento e visualização da integridade da compilação (experimental)
Como parte das ferramentas de análise do Horde, introduzimos uma nova funcionalidade experimental, o painel Integridade da Compilação, que oferece às equipes uma forma de monitorar e inspecionar quais etapas do BuildGraph nas listas de alterações dos projetos estão sendo concluídas conforme o esperado e/ou relatando erros.
Isso faz parte de um desenvolvimento contínuo para oferecer funcionalidade nativa no Horde, ajudando as equipes a melhor entender as causas mais comuns de falhas de compilação, monitorar a carga nos pools de agentes e acompanhar outras métricas de desempenho de compilação úteis que afetam seus tempos de iteração.
Áudio
Audio Insights (Beta)
Audio Insights é nossa principal ferramenta para criação de perfil e depuração de áudio. Voltado para todas as pessoas que usam áudio na Unreal Engine. Nesta versão, além de estabilizar a API e a arquitetura, estamos enviando uma versão Beta de Audio Insights. Ele inclui as seguintes funcionalidades principais adicionais:
Monitoramento
Inicie uma sessão de monitoramento ao vivo sem gravar dados no disco.
Designers de som podem observar a operação de um projeto, tanto em sessões autônomas quanto em sessões do editor, por períodos mais longos, sem a preocupação de ter espaço suficiente em disco.
Compatibilidade com o editor
Use o Audio Insights para casos de uso no editor, além do JNE.
O Audio Insights agora reage a qualquer interação de áudio no editor.
Instantâneos e gravação de extremidade
Grava os dados da última sessão ao vivo no disco sob demanda, até 32 MB.
O Audio Insights pode detectar se uma sessão ao vivo foi iniciada para se conectar a ela.
Medição de intensidade de som ao vivo (design de UX)
Fornece medição de áudio em modo autônomo, especificamente para conformidade com intensidade de som.
Histórico de eventos com rolagem
Visualize uma lista cronológica de texto dos eventos de áudio, como início e parada de som com carimbos de data/hora.
A seleção de um evento específico move o gráfico e outras visualizações para o mesmo carimbo de data/hora nos dados.
Configuração de nós de MetaSound
A Configuração de nós de MetaSound proporciona uma nova camada de expressividade a MetaSounds, possibilitando que um nó altere suas entradas e saídas. A configuração de nós aproveita o painel Detalhes do Editor do MetaSound para fornecer um caminho para modificar as interfaces do nó e serializar os dados auxiliares utilizáveis quando um nó renderiza o áudio.
Além de oferecer a pessoas designers e desenvolvedoras de som uma maneira de criar nós com mais nuance e interatividade, a configuração de nós oferece uma experiência de usuário aprimorada. Por exemplo, limpando a paleta de nós e reduzindo o número de etapas e reconectando a complexidade de muitas tarefas comuns de design de MetaSounds.
Plugin de legenda de áudio
Legendas de áudio são necessárias para acessibilidade: sistemas de diálogo, legendas codificadas e bate-papo de voz. Na Unreal Engine 5.7, estamos aprimorando ainda mais o plugin de legendas com as seguintes adições:
As legendas agora podem ser acionadas por outros tipos de SoundBase, além do SoundWave original e do suporte a temporização independente na versão 5.6. Assim, as legendas agora podem basear seu tempo em relação a SoundCues ou ao nível superior de um MetaSound.
Por padrão, as legendas anexadas aos dados de usuário do ativo
USoundWavesão reproduzidas e interrompidas automaticamente usando o horário em que o áudio começa e para. No entanto, há um caso de uso para a propriedade de duração da legenda. Adicionamos uma enumeração para fornecer um método para os usuários escolherem a duração a ser usada.Agora, várias legendas são compatíveis com o ativo de dados de usuário. Em vez de usar vários ativos para várias legendas associadas a um determinado efeito sonoro, você tem todas as legendas em um único ativo.
Assim, é possível habilitar ou desabilitar as legendas globalmente usando
UEngine::bSubtitlesEnabled.
Editor de formato de onda de áudio
Frequentemente, designers de som precisam ir e voltar da UE para uma ferramenta externa ao trabalhar com ativos de áudio. Para ajudar seu fluxo de trabalho na Unreal Engine 5.7, adicionamos a exibição de marcadores e regiões de loop de arquivos de som importados para o Editor de formato de onda de áudio.
Ele inclui aprimoramentos adicionais de qualidade de vida para expandir o editor de ondas para que tenha funcionalidades suficientes para que designers de som possam permanecer na UE para tarefas comuns de edição de áudio.
Tipos de formato/canal agnóstico (CAT)
Designers de som frequentemente precisam enviar e receber dados de áudio multicanal entre nós de MetaSound específicos de vários formatos e contagens de canais. Na UE 5.7, pessoas programadoras de áudio podem codificar nós personalizados que contêm referências de entrada e saída usando tipos de canais agnósticos (CAT):
O novo tipo de dados de taxa de áudio oferece uma maneira de os buffers de áudio serem compatíveis com vários canais em um tipo de pin.
Os nós agora podem aceitar várias configurações para formatos de canal de áudio.
Reduz a desordem e a complexidade nos gráficos do MetaSound.
Amostra de ferramentas Tech Audio
A experiência e o uso do utilitário do editor da Tech Audio podem ser extremamente benéficos para a comunidade de áudio de jogos. Essa iniciativa visa ajudar a integrar novos desenvolvedores ao UE Audio, tornar o trabalho em escala menos assustador e servir como ponto de partida para desenvolvedores criarem suas próprias ferramentas específicas de projeto.
Um conjunto de utilitários, ferramentas, gráficos e scripts de Blueprint para ajudar a trabalhar com a tecnologia Unreal Audio.
A Tech Audio gostaria de criar uma coleção exemplar de utilitários de editor e fluxos de trabalho para usar internamente e apresentar externamente.
Plataforma
Suporte a plataformas Android
Melhoramos os fluxos de trabalho para desenvolvedores que compilam, empacotam e implementam projetos da Unreal Engine em dispositivos Android.
Implementação no Android 15 com suporte a páginas de 16 kb
Ignore ajustes manuais de configuração do SDK no macOS.
A configuração
bDontBundleLibrariesInAPKagora está habilitada por padrão, garantindo que as bibliotecas sejam mantidas externas para melhorar o tamanho do pacote e a flexibilidade da implementação.
Renderizador móvel
A Unreal Engine 5.7 traz melhorias e novas funcionalidades para o Renderizador móvel.
Agora, é possível usar o modo de renderização diferida multipassagem, que habilita sombras de contato e sombras de inserção.
Além disso, SSAO, SSR e DFAO agora são opções de escalabilidade, que podem ser alternadas no tempo de execução, não precisando mais ser definidas como opções de projeto e reempacotadas.
Camada estéreo
Os componentes da camada estéreo agora são visíveis quando o eixo X aponta para a câmera. Para habilitar o comportamento legado (visível quando X aponta para longe da câmera), use a variável de console: XR``.StereoLayers.UseLegacyFacing true.
As camadas estéreo emuladas agora são compatíveis com a profundidade e com o OpenXR na forma como são renderizadas. Você pode desativar a nova renderização usando a variável de console: XR``.StereoLayers.RenderEmulatedLayerDepth false.
Aplicativo SpaceWarp para OpenXR
O aplicativo SpaceWarp é a tecnologia de otimização orientada a desenvolvimento da Meta, que pode liberar uma capacidade computacional extra para o conteúdo adequado. Na UE 5.7, implementamos suporte não apenas para a extensão XR_FB_space_warp da Meta, como também para os tempos de execução do OpenXR compatíveis com
XR_EXT_frame_synthesis
. Essa tecnologia força o aplicativo a renderizar com metade da taxa de quadros e sintetizar todos os outros quadros com uma orientação atualizada da cabeça, reduzindo consideravelmente a carga na GPU.
A síntese de quadros (e o SpaceWarp) é controlada com xr.OpenXRFrameSynthesis. Você pode habilitá-la no tempo de execução, mas ela requer r.Velocity.DirectlyRenderOpenXRMotionVectors=1.
Presença do usuário do OpenXR
Agora, podemos retornar eventos quando um capacete de realidade virtual (CRV) é colocado ou retirado para tempos de execução do OpenXR compatíveis com a extensão XR_EXT_user_presence do OpenXR. Embora isso tenha sido exposto por meio de VRNotificationsComponent no passado, o novo método é mais preciso e tem o mesmo comportamento entre tempos de execução.
Design de movimento
Design de movimento pronto para produção
À medida que os clientes começam a implementar o design de movimento em seus fluxos de trabalho principais, a equipe do design de movimento continuará a avaliar o feedback dos clientes e a se concentrar em mais oportunidades de otimização do desempenho do conjunto de ferramentas.
Para que o design de movimento ficasse pronto para a produção, foi necessário o seguinte:
Fortalecer o suporte a empacotamento.
Refatorar o Text3D para aceitar o recurso de Rich Text e mascaramento.
Estabilizar a lógica de transição e aumentar a facilidade de uso e configuração.
Aprimorar a funcionalidade do controle remoto, adicionando ferramentas de organização da interface e refatorando a experiência do usuário geral para acelerar o tempo de configuração.
Atualizar o estado da cena com base no feedback dos clientes.
Criar comunicação entre o estado da cena e a lógica de transição.
Garantir a confiabilidade do Designer de materiais.
Text3D — Rich Text
Dê aos seus layouts de texto uma vantagem dinâmica com texto pré-configurado ou dinamicamente personalizável. Crie um conjunto de estilos Text3D usando nosso novo ativo dedicado, no qual você pode criar uma configuração consistente que pode ser usada em todo o seu projeto em qualquer ator Text3D.
Anteriormente, esse tipo de layout exigia vários atores Text3D e um modificador de acompanhamento automático. Na Unreal 5.7, eles podem ser editados em linha, reduzindo a contagem de atores e até mesmo fornecendo uma maneira de controlar remotamente as seções de texto individuais.
Compatível com a atribuição de fontes, cores e dimensionamento.
As ferramentas de estilo flexíveis se adaptam a qualquer direção de arte.
Ideal para designs com interface de usuário dinâmica.
Expõe cada seção da linha de texto ao controle remoto para personalização adicional.
Útil quando você deseja dividir algo como "Novo texto aprimorado" em três controladores separados, mantendo o estilo de cada palavra.
Qualidade de vida para a lógica de transição
A lógica de transição é fundamental para o fluxo de trabalho de transmissão e, com base no feedback de clientes, reavaliamos as etapas necessárias para criar um nível e configurar a lógica de transição. Agora, você pode realizar todas as etapas da imagem acima criando um novo nível e certificando-se de que a opção Criar cena padrão de lógica de transição esteja habilitada, conforme visto no canto superior esquerdo da imagem.
Abaixo estão as etapas de configuração que a lógica de transição automatiza quando você habilita a opção "Criar cena padrão de lógica de transição":
Criação de sequências de entrada e saída pré-rotuladas.
Criação de sequências pré-rotuladas de mudança de camada.
Possibilidade de incluir sequências adicionais (e pré-atribuídas) de mudança de camada com novas entradas no painel de opções do Sequencer.
Pré-definição das configurações nessas sequências para compatibilidade imediata.
Criação de uma camada padrão para que você possa começar a trabalhar imediatamente e testar seu design.
Adição do modificador de subcamadas de lógica de transição a um ator nulo no seu Organizador de design de movimento e atribuição prévia às sequências de entrada e saída geradas.
Tudo o que é necessário além disso é animar o conteúdo usando as sequências geradas de entrada, saída e mudança.
UX de controle remoto
Adicionamos ou aprimoramos várias funcionalidades que economizam seu tempo ao fazer a animação do esqueleto dos seus projetos.
Novos controladores
Categoria
Adicione categorias para separar seus controladores em grupos.
Selecione um ou vários controladores e arraste-os até as categorias.
Lista de strings
Organize uma lista suspensa nomeada que pode ser vinculada aos comportamentos condicionais para aprimorar a experiência do usuário final.
Anteriormente, para resolver esse problema, seria necessário inserir números inteiros em que "1 = Azul, 2 = Vermelho, 3 = Amarelo", mas agora é possível nomear as entradas do menu suspenso como Vermelho, Azul, Amarelo.
Eventos
Crie um botão que pode reproduzir sequências de design de movimento, acionar uma propriedade "Ao modificar" ou acionar um evento de transmissão.
Comportamento de caminho
Anteriormente, cada entrada do comportamento de caminho só podia abordar um único ator. Agora, há uma lista que aparece sob o painel Ações, na qual você pode adicionar quantos atores quiser, reduzindo a necessidade de vários comportamentos de caminho e facilitando a solução de problemas da configuração.
Antes, não era possível reordenar a lista de caminhos. Agora, você pode usar a alça de arrastar do lado esquerdo para reordenar conforme necessário.
A visualização do caminho agora informa se o caminho para o qual você está roteando é válido ou não com uma marca de seleção verde.
Aprimoramento da interface de usuário
Adicionamos um ícone de link ao painel de propriedades do lado esquerdo para mostrar se uma propriedade exposta está atribuída a um controlador.
Estado da cena
O estado da cena na UE 5.7 recebeu várias funcionalidades novas e melhorias de UX que aprimoram muito o controle do usuário.
Organização da máquina de estado
Reordenação das máquinas de estado arrastando e soltando.
Adição de categorias.
Adição de tarefas setter como parte das referências de propriedade.
Os tipos de dados incluem: booleano, float, inteiro, string, texto.
Cada tipo de dado tem uma funcionalidade exclusiva.
Funções de propriedade
Concatenar string
Texto para string
Nome para string
Inteiro para string
Float para string
Gerar atores e gerar atores para marcadores.
Link de dados
O link de dados recebeu duas atualizações muito solicitadas:
Funcionalidade de envio, fornecendo um método para a detecção constante de valores variáveis de feeds para acionar atualizações.
Interação com o estado da cena para fornecer um método de rolagem de marcadores e outros elementos vivos.
Pipeline de renderização de produção
Modificador de coleção de parâmetros de material
As coleções de parâmetros de material são ativos poderosos que podem conduzir várias propriedades em vários materiais ao mesmo tempo. Aparências e efeitos criativos em uma cena geralmente são impulsionados dinamicamente por coleções de parâmetros de material.
O modificador de coleção de parâmetros de material oferece uma maneira de definir e substituir valores de parâmetros por camada de renderização no Movie Render Graph. Usando o mesmo nível e a mesma sequência de nível, você pode renderizar planos com valores de parâmetros diferentes em cada camada de renderização. Também pode transformar parâmetros em variáveis de gráfico e expô-los como substituições nas janelas Renderização rápida e Movie Render Queue.
Tipo de gravação por saída
A capacidade de renderizar vários tipos de saída no mesmo trabalho significa que o Movie Render Graph pode fornecer mídia final e de revisão simultaneamente. Normalmente, a gravação é desejável para alguns, mas não para todos os tipos de saída em um trabalho. Para levar isso em conta, o Movie Render Graph agora define o tipo de gravação por saída em vez de usar um nó separado em uma ramificação. Isso torna muito mais simples, por exemplo, ter renderizações EXR limpas, mas incluir gravação em MP4.
Controle de nomenclatura de arquivos
Convenções sólidas de nomenclatura na saída de renderização são um componente básico de pipelines eficientes em todos os setores. Com isso em mente, o Movie Render Graph oferece um controle de nomenclatura de arquivos muito mais robusto para ser compatível com os requisitos de nomenclatura específicos dos estúdios de forma nativa, sem a necessidade de códigos de pipeline adicionais. Os principais aprimoramentos incluem:
Tokens de nomenclatura personalizados definidos nas ferramentas de montagem cinematográfica são compatíveis com todos os campos de nome.
Você pode personalizar {renderer_name} (por exemplo, "Diferido") e {renderer_sub_name} (por exemplo, "beauty"), e os conflitos são resolvidos por ramificação e não para todo o gráfico, oferecendo mais flexibilidade.
A gravação não força mais {renderer_name} na renderização final (beauty) quando não for adicionado.
As passagens de material de pós-processamento podem usar uma convenção de nomenclatura separada da renderização final, se desejado.
Metadados EXR por camada de renderização
Os metadados EXR agora seguem uma convenção que separa de forma confiável os pares de chave-valor em uma base de camada por renderizador e evita conflitos de nomes. Com base nessa convenção, os metadados das renderizações da Unreal Engine podem ser consultados diretamente em aplicativos de pós-composição, como o Nuke, sem a necessidade de ferramentas adicionais de pipeline.
Pipeline de conteúdo
Personalizar a importação de ativos em USD com Interchange (experimental)
USD é um formato de arquivo de descrição de cena versátil com adoção crescente na indústria 3D.
Adicionamos o USD à lista de formatos de arquivo compatíveis com a estrutura do Interchange na UE 5.5. As pessoas criadoras de conteúdo se beneficiam de mais controle sobre o processo de importação e agora podem adicionar etapas de processamento personalizadas à importação de ativos de arquivos USD, de forma semelhante aos recursos do Interchange que já estão disponíveis com outros formatos, como o FBX.
O suporte ao USD por meio do Interchange é considerado experimental e limitado à importação de ativos. Na UE 5.7, adicionamos suporte para:
Groom
Luzes de domo (não o esquema DomeLight_1)
Áudio (UsdMediaSpatialAudio)
Instância de ponto
Importação de nível FBX com Interchange
Em um esforço para alinhar a interface de usuário e a UX para importar diferentes formatos de arquivo para a engine, o processo de importação de nível de FBX está disponível por meio do Interchange Framework. Este é agora o caminho padrão para importar um FBX para um nível. Os usuários ainda podem retornar ao comportamento legado com a ajuda de uma CVAR.
A principal alteração vem do uso da mesma caixa de diálogo de importação usada para importação na pasta de conteúdo. Funcionalidades descontinuadas, como remover ativos ou atores da importação ou usar diferentes conjuntos de opções para importação, agora podem ser executadas por meio de pipelines personalizados do Interchange.
Editor e Sistemas de Interface de Usuário
AI Assistant (experimental)
O AI Assistant oferece uma maneira mais rápida de obter respostas sem que você precise sair da Unreal Engine. Ao arrastar um painel dedicado para o editor, você pode fazer perguntas, gerar código ou seguir instruções passo a passo, tudo sem precisar alternar para um navegador.
Você economiza tempo e se mantém no fluxo de pensamento. Em vez de interromper a concentração para pesquisar on-line, você pode obter ajuda, exemplos e dicas de solução de problemas instantâneas diretamente no editor.
O que você pode fazer:
Oferecer instruções passo a passo para tarefas.
Obter orientação e dicas em contexto direto.
Solucionar problemas relacionados ao desenvolvimento com o auxílio da IA.
Gerar exemplos de código para acelerar os fluxos de trabalho.
Fazer referência a conversas anteriores com o histórico do bate-papo.
Copiar e colar respostas no seu projeto.
O AI Assistant é alimentado pela mesma IA especialmente treinada e já disponível no UEFN e na Comunidade de Desenvolvedores. Ela foi projetada para entender a Unreal Engine e te ajudar a trabalhar mais rápido.
Tela de início
A tela de início ajuda você a navegar pela Unreal Engine, fornecendo um ponto de partida de boas-vindas. Ela destaca recursos essenciais como tutoriais, documentações e fóruns.
Você tem acesso a uma experiência de integração guiada e simplificada. Em vez de se deparar com um editor vazio, você dispõe de navegação clara para recursos de aprendizado, notícias e suporte em um só lugar, ajudando você a iniciar projetos com confiança e direção.
O que você pode fazer:
Acesse as notícias e atualizações mais recentes.
Navegue diretamente aos recursos de primeiros passos.
Abra tutoriais e documentações.
Visite fóruns e notas de versão.
Abra links externamente no Chrome.
Desligue a tela de início se preferir não vê-la sempre.
A tela de início funciona como um hub de integração completo, tornando a Unreal Engine mais acessível desde a primeira inicialização.
Interações de recorte ortogonal
As janelas de visualização ortogonais agora oferecem controles mais confiáveis e flexíveis. Em versões anteriores, os planos de recorte ficavam frequentemente inutilizáveis, dificultando o ajuste do que estava visível na cena.
Você obtém controle preciso sobre o que vê nas visualizações ortogonais, facilitando o foco exatamente na geometria necessária.
O que você pode fazer:
Ajuste os planos de recorte próximo e distante com maior precisão.
Use novos controles visuais diretamente na janela de visualização.
Personalize a visibilidade nas visualizações ortogonais para corresponder ao seu fluxo de trabalho.
Essa melhoria, corrigida na UE 5.7, torna os fluxos de trabalho ortogonais mais práticos e previsíveis.
Caixas de diálogo aprimoradas para salvar e excluir
Melhoramos as caixas de diálogo Salvar e Excluir na Unreal Engine para tornar o gerenciamento de ativos mais eficiente. Ações comuns agora funcionam conforme o esperado, reduzindo cliques desnecessários e interrupções de fluxo de trabalho.
Você passa menos tempo lidando com prompts repetitivos e mais tempo com o foco voltado para o seu projeto.
O que você pode fazer:
Use a tecla Enter na janela pop-up para excluir ativos (antes indisponível).
Exclua vários ativos sem precisar clicar repetidamente em "Aceitar" com o mouse.
Conte com interações de caixa de diálogo mais consistentes e intuitivas.
Essas melhorias chegam na UE 5.7 e simplificam os fluxos de trabalho diários ao corrigir problemas antigos.
Interações aprimoradas de arrastar janelas
Agora ficou mais intuitivo e menos inconveniente arrastar janelas dentro do editor. Em versões anteriores, clicar e arrastar nas barras de título desacoplava todo o Editor de Níveis no modo tela cheia, muitas vezes por acidente.
Você evita cliques acidentais frustrantes e mantém seu espaço de trabalho estável, para manter o foco na criação.
O que você pode fazer:
Arraste janelas e painéis sem desacoplar todo o Editor de Níveis.
Evite interrupções acidentais em fluxos de trabalho em tela cheia.
Aproveite interações de janela mais previsíveis e amigáveis.
Essa melhoria, corrigida na UE 5.7, resolve uma frustração comum e faz com que o gerenciamento de janelas seja mais confiável.
Interações de duplicação aprimoradas no Editor de Blueprint
Duplicar itens no Editor de Blueprint agora é uma ação mais fluida e menos disruptiva. Em versões anteriores, a duplicação limpava a seleção, forçando você a repetir a seleção manual dos itens na visualização em árvore.
Você mantém o ritmo durante a edição, evitando cliques extras e retrabalho ao duplicar elementos.
O que você pode fazer:
Duplique itens no Editor de Blueprints sem perder a seleção.
Mantenha as seleções ativas ao trabalhar na visualização em árvore.
Reduza etapas repetitivas duplicando vários itens.
Essa melhoria, corrigida na UE 5.7, faz com que a edição de Blueprints seja mais eficiente e sem frustrações.
Modos da janela de visualização de inspeção de geometria
Os novos modos de visualização de inspeção de modelo na Unreal Engine oferecem opções de visualização simplificadas e não fotorrealistas. Esses modos priorizam a clareza geométrica em vez do realismo, removendo luz e sombras durante a inspeção de modelos mecânicos ou 3D complexos:
Argila
Zebra
Face frontal/traseira
Cor aleatória
Tags de ativos do usuário
O sistema de tags de ativos do usuário permite a adição de tags arbitrárias aos seus ativos. Ele oferece suporte a favoritos locais, bem como a tags de todo o projeto, e pode ser expandido para sugerir tags adicionais. Essas tags servem como base para sistemas adicionais, como o Navegador de Ativos Marcados usado no Niagara. Selecione os ativos que deseja etiquetar e use CTRL + T ou selecione Gerenciar tags no menu de contexto.
Navegador de Ativos Marcados (Niagara)
Uma atualização da reformulação anterior do Navegador de Ativos do Niagara. Agora generalizado, estabelece a base para fábricas de ativos que queiram adotar o mesmo navegador. É possível expandi-lo criando um novo ativo de configuração do Navegador de Ativos Marcados, definindo suas próprias seções e tags listadas. Dessa forma, seus projetos podem ter seções e tags personalizadas ou substituir completamente o ativo de configuração principal nas Configurações do Projeto, no Editor do Niagara.
Para ter ajuda em atualizar os sistemas e emissores existentes do Niagara para que usem o novo ativo de Configuração do navegador de ativos marcados, consulte Atualização de tags do Niagara (Como usar tags do Niagara).
Framework
State Tree: Depurador de retrocesso
Estamos introduzindo uma nova faixa Depurador de retrocesso para o State Tree que traz uma experiência de depuração aprimorada e orientada ao proprietário e à instância diretamente no Depurador de retrocesso. Essa integração fornece um contexto mais profundo sobre quando e como a lógica de comportamento é executada, tudo isso alinhado com os cronogramas de jogabilidade e animação.
A nova trilha inclui um painel Detalhes dedicado com uma exibição em árvore compacta, facilitando a visualização e a navegação em configurações lógicas complexas, incluindo subárvores aninhadas e ativos vinculados. Isso melhora a usabilidade ao trabalhar com State Trees maiores ou modulares.
Embora essa integração marque uma mudança em direção a um fluxo de trabalho de depuração mais unificado, o depurador original do State Tree continua disponível como uma opção. Você pode continuar usando a interface legada se preferir para alguns casos de uso.
Tempo de execução do State Tree
Essa atualização traz uma série de aprimoramentos em nível de tempo de execução que melhoram a correção e o desempenho da lógica baseada no State Tree.
Vinculação de propriedades em tempo real: os nós agora podem enviar atualizações de valores para saídas vinculadas dinamicamente durante a execução usando as propriedades de saída, resolvendo problemas com dados desatualizados ou estáticos em fluxos de trabalho de marcações.
ExecutionRuntimeData: os nós agora podem declarar dados opcionais de longa duração que persistem durante toda a vida útil da instância do State Tree, o que é útil para manter o estado de execução em transições ou marcações sem depender de globais estáticos.
Otimização de memória para vinculações estáticas: emissores delegados, ouvintes e referências de propriedade agora são armazenados fora dos dados da instância, reduzindo a sobrecarga de memória por nó.
Implementamos as seguintes funcionalidades, mas não as habilitamos por padrão para evitar a interrupção dos dados existentes e dos comportamentos padrão. No entanto, você pode optar por usá-las, se desejar:
Comportamento de reentrada no estado: adicionamos suporte para a reentrada no mesmo estado e o reinício de tarefas, oferecendo uma maneira de implementar a lógica de reinício com mais facilidade.
Refatoração de dados de instância: as condições e transições agora usam dados de instâncias com escopo, evitando o vazamento de dados entre sessões e possibilitando padrões de uso temporários e persistentes.
Depurador de massa
Introduzimos um novo e poderoso sistema de pesquisa de entidades integrado diretamente ao depurador do Mass, oferecendo às pessoas desenvolvedoras uma nova interface de usuário para criar e executar consultas de MassEntity. A interface espelha a API de consulta C++ do Mass em 1:1, permitindo a filtragem precisa de entidades usando os mesmos critérios e requisitos das consultas codificadas.
Agora, você pode criar, salvar, carregar e compartilhar consultas personalizadas e visualizar imediatamente os resultados na guia Entidades. Isso melhora a rapidez e a eficiência de inspeção e validação do estado do Mass em tempo de execução durante o desenvolvimento.
Além disso, atualizamos substancialmente o sistema de pontos de interrupção, oferecendo mais controle e visibilidade na depuração de processadores em massa e gravações de fragmentos.
Configuração de vários saltos do Autogen NavLink
Expandimos a geração automática de links de navegação para oferecer suporte a várias configurações de salto por passagem de geração de NavMesh. Anteriormente, só era possível usar uma única configuração de salto, o que muitas vezes exigia tolerâncias excessivamente amplas para lidar com diversos tipos de links (por exemplo, saltos para cima, para baixo e transversais). Isso também significava que todos os links gerados compartilhavam a mesma classe de área e a mesma classe de equivalente de link, limitando a flexibilidade.
Com essa atualização, agora é possível definir várias configurações distintas, cada uma processada em sua própria passagem de validação. Isso habilita um controle mais direcionado e significativo. Por exemplo, gerar saltos para cima e saltos transversais separadamente, cada um com diferentes limites de distância, tipos de área ou comportamento de proxy. Possibilita configurações de movimento mais sutis e, ao mesmo tempo, reduz a geração excessiva ou as sobreposições não intencionais.
Para garantir a compatibilidade com versões anteriores, migramos todas as configurações de salto único existentes como a primeira entrada na nova configuração de várias configurações.
Continuamos a aprimorar a experiência do editor do State Tree com várias atualizações de qualidade de vida destinadas a melhorar a clareza e a usabilidade:
Agora é possível copiar e colar tarefas, condições e transições entre estados, mesmo em diferentes ativos do State Tree. Facilita muito a reutilização da lógica e a manutenção de um comportamento consistente em grandes comportamentos.
Também adicionamos a capacidade de copiar e colar vinculações de propriedades individuais. As propriedades vinculadas e não vinculadas são tratadas de forma inteligente:
As propriedades vinculadas substituem suas vinculações, se compatíveis.
Propriedades não vinculadas transferem valores se um valor for colado, ou transferem a vinculação se uma vinculação compatível for colada.
A colagem de um valor em uma propriedade vinculada está desabilitada.
A colagem de um tipo incompatível, ou se os dados de origem estiverem inacessíveis, acionará um erro de validação.
Você pode ocultar propriedades dentro de nós e dados de instância com base no esquema, reduzindo o ruído visual e melhorando o foco.
Tempo de execução do Mass
Essa atualização inclui uma série de otimizações de baixo nível e refinamentos de arquitetura na estrutura do Mass, com o objetivo de melhorar o desempenho geral, a eficiência da memória e a estabilidade do sistema em cenários de tempo real.
A adição mais notável é o divisão de tempo do processador, que significa que os processadores de longa duração podem ser divididos em vários quadros. Ajudando assim a reduzir os picos de desempenho e permitindo uma melhor distribuição de cargas de trabalho pesadas, o que é especialmente útil em ambientes de grande escala ou com muita simulação.
Iris (Beta)
Com o Iris saindo da versão Experimental e entrando na versão Beta, nos concentramos em solidificar as principais APIs e melhorar a usabilidade, a capacidade de manutenção e o desempenho em toda a pilha de rede. Essa versão inclui várias alterações internas de design e melhorias de qualidade de vida para os desenvolvedores que trabalham diretamente com os sistemas de replicação da Iris.
Substituições de fábrica de atores: os atores agora podem especificar implementações
NetActorFactorypersonalizadas usandoStartReplicationParams, o que proporciona mais flexibilidade no comportamento de replicação em tempo de execução. Isso habilita configurações avançadas de replicação sem depender de substituições globais.Limites de API mais limpos: removemos a classe base Iris
UReplicationBridgepara reduzir a sobrecarga de chamadas virtuais e simplificar a navegação no código. A maioria dos sistemas Iris já depende diretamente deUObjectReplicationBridge, portanto, essa alteração simplifica o modelo de herança e evita indireções desnecessárias.Nomeação aprimorada do ciclo de vida da replicação: esclarecemos a API
BeginReplication:A função não virtual agora é
StartActorReplication, indicando claramente sua finalidade como o ponto de entrada para iniciar a replicação.Renomeamos a chamada de retorno virtual para
OnBeginReplication, separando o comportamento do ciclo de vida das chamadas do sistema.
Melhor consistência entre o Iris e a rede legada: agora,
OnBeginReplicationeEndReplicationsão chamados de forma consistente, independentemente de o Iris estar habilitado, garantindo a paridade de comportamento e tornando a transição entre os sistemas de rede mais perfeita.Suporte a deslocamentos sem interrupções: o Iris agora é compatível com a funcionalidade de deslocamento sem interrupções da Unreal Engine, garantindo que os atores e estados replicados sejam tratados corretamente nas transições de mundo. Esse é um requisito fundamental para o envio de funcionalidades de jogos que dependem de dados persistentes de agente de interação ou de transições entre grandes mundos de transmissão.
Mídia
Visualizador de Mídia (Beta)
Muitas vezes, animadores precisam alinhar suas animações com as filmagens de referência existentes. Na versão 5.6, adicionamos o recurso de fixar a mídia (imagens, texturas de mídia, arquivos de vídeo, janelas de visualização ao vivo) ao lado de onde o trabalho de animação é feito. Dois bancos A/B em configurações horizontais ou verticais ajudam a comparar dois conjuntos de ativos. Os controles de zoom e panorâmica podem ser usados para alinhar melhor o conteúdo. Na UE 5.7, o plugin Visualizador de Mídia está agora na versão Beta, pois inclui as seguintes melhorias no fluxo de trabalho e na usabilidade:
Controles aprimorados, como os de rotação e zoom, usando ALT + botão direito do mouse.
Capacidade de favoritar e recuperar rapidamente as configurações de ativos com teclas de atalho.
O botão de cadeado agora também reflete os controles de reprodução e a linha do tempo no modo de Jogador duplo.
Simulação e Efeitos Visuais
Chaos Destruction
O sistema Chaos Destruction é um conjunto de ferramentas projetado para atingir níveis de destruição com qualidade cinematográfica e em tempo real. Além dos visuais de excelente aparência, o sistema é otimizado para o desempenho, proporcionando a artistas e designers mais controle sobre a criação de conteúdo e o processo de fraturamento por meio de um fluxo de trabalho intuitivo e não linear.
As atualizações da UE 5.7 incluem:
Redefinição de estado: agora, você pode redefinir o estado do componente de coleta de geometria usando C++, Blueprint ou ao vivo no editor durante a simulação.
Exportação para malhas esqueléticas: agora, é possível exportar ativos de coleção de geometrias para um ativo de malha esquelética.
Subtraçado de folhas: agora, após traçar uma coleção de geometria, é possível obter o cone de folha exato a partir de um traçado de linha. Quando não há interrupções, o traçado da linha original relativo ao componente retorna o osso-raiz. Com essa nova função, agora é possível obter o osso exato que o traçado atinge. Isso possibilita ações como definir decalques nos ossos certos ou até mesmo ancorar peças individuais no tempo de execução.
Editor de fluxo de dados do Chaos
O gráfico de fluxo de dados possibilita a geração procedural de ativos em um ambiente baseado em nós. A implementação do gráfico utiliza uma avaliação baseada em pull, onde os nós do gráfico geram um estado de saída em cache com base na avaliação de suas entradas. Os ativos do fluxo de dados são usados para auxiliar na criação de procedimentos e na configuração de sistemas de simulação.
O Chaos Cloth, Destruction, Flesh e Hair usam o conjunto de ferramentas unificado baseado em nós do fluxo de dados.
As atualizações da UE 5.7 incluem:
Novos controles de linha do tempo e simulação.
Uma nova barra de ferramentas.
Uma ferramenta "Pintar mapa de peso" redesenhada (para corresponder ao editor de malhas esqueléticas).
Uma nova ferramenta "Editar peso do revestimento" (para combinar com o editor de malhas esqueléticas).
Uma nova ferramenta "Editar ossos do esqueleto".
Muitas melhorias na qualidade de vida.
Depurador visual do Chaos
O depurador visual do Chaos (CVD) é uma ferramenta versátil projetada para gravar e reproduzir o estado de uma simulação de física durante o jogo. Ele suporta a gravação de todos os solucionadores Rigid e RBAN ativos, incluindo estados de partículas e dados de colisão. O CVD pode ser acessado como uma ferramenta de edição na Unreal Engine e oferece diversas opções de personalização, como a escolha de canais de dados específicos para gravar, por meio da interface de usuário ou por meio de comandos do console.
A ferramenta também apresenta funcionalidades de depuração ao vivo, permitindo a inspeção em tempo real de dados de física durante a simulação. Além disso, o CVD inclui uma variedade de opções de visualização, como estado de partículas, dados de colisão e consultas de cena, para ajudar você a analisar e solucionar problemas de simulações de física de maneira eficaz.
As atualizações da UE 5.7 incluem:
Aprimoramentos no nome do objeto: nesta versão, introduzimos uma nova funcionalidade chamada metadados de partículas.
Esses novos metadados substituem a antiga e longa string "Nome de depuração".
O CVD agora mostra o nome do ator que tem o nome do corpo físico e o divide em diferentes campos (Nível, Componente e Índice ósseo).
Além disso, introduzimos um botão Localizar no Navegador de Conteúdo que aproveita esses novos metadados e fornece uma forma de pesquisar o Blueprint de onde vem um corpo específico com um único clique.
Melhorias no desempenho: nesta versão, continuamos trabalhando para melhorar o desempenho do CVD.
Os arquivos do CVD com uma grande quantidade de dados (especificamente mais de 2 GB de dados de geometria de colisão) agora são carregados até 30% mais rápido.
Redução do tempo de espera de mais de 10 segundos que poderia ocorrer ao carregar o primeiro quadro de cenas complexas (mais de 93.000 objetos) para cerca de 3 segundos.
Essa versão também inclui correções de bugs e melhorias de qualidade de vida.
Chaos Cloth
À medida que a simulação de tecidos e roupas complexas se tornam mais amplamente solicitadas na engine, nosso antigo editor de tecidos e fluxo de trabalho de malha esquelética não podem se ajustar facilmente às futuras atualizações necessárias para dar suporte a essas necessidades. A moda e a maioria dos trabalhos de personagens têm se voltado quase exclusivamente para o uso de criação de conteúdo digital, especializados na construção de roupas baseadas em painéis. Para crescer com esses criadores de conteúdo digital externos, continuamos a desenvolver nosso editor de tecido para importar e editar configurações de painel enquanto refinamos o fluxo de trabalho de configuração de tecido.
O Chaos Cloth para a Unreal Engine 5.7 inclui o desenvolvimento contínuo de um editor de tecidos em versão Beta.
As atualizações da UE 5.7 incluem:
Integração de dados de roupas para malha esquelética:
Agora, você pode adicionar ativos de tecido e trajes como dados de roupas de malhas esqueléticas.
As seções de renderização da malha esquelética podem então ser deformadas pela configuração da simulação de tecido dentro do gráfico de fluxo de dados desses ativos, eliminando a necessidade de um componente de tecido adicional.
Novas opções de espaço de referência:
Use o novo nó de fluxo de dados ReferenceBone para definir explicitamente o ReferenceBone em vez de usar o que foi calculado automaticamente.
Use a nova opção de espaço de amortecimento local para resolver no espaço ReferenceBone em vez de usar o centro de massa.
Otimizações: implementamos otimizações na thread do jogo de tecido e na marca de verificação interagente.
Malhas de acessórios (experimental):
Adicionamos malhas de acessórios adicionais e atualizamos a restrição de batente para poder usar essa malha de acessório.
Atualmente, você pode criar malhas de acessórios convertendo uma coleção de malhas de simulação existente em uma malha de acessórios. Se existirem IDs de vértices importados nas coleções de origem e de destino, você poderá usá-los para fazer a correspondência entre os índices de vértices que foram reordenados como parte de uma importação de malha esquelética.
Chaos Core
A Chaos Physics está continuamente passando por atualizações e otimizações para oferecer a artistas, pessoas desenvolvedoras e programadoras melhores resultados de simulação. A dinâmica de corpos rígidos é a tecnologia central em que a física da maior parte da dos jogos confia. Conforme progredimos em direção a mundos baseados e habilitados por física cada vez maiores, precisamos garantir que esse sistema central seja dimensionado e possa suportar esses casos de uso. Assim como a dinâmica de corpos rígidos, as consultas são uma tecnologia central da qual uma grande variedade de sistemas dentro da Unreal Engine depende. Além disso, assim como a dinâmica de corpos rígidos, precisamos garantir que o desempenho das consultas seja dimensionado para mundos dinâmicos muito grandes.
As atualizações da UE 5.7 incluem:
Melhorias no desempenho da simulação:
Mais estágios de simulação paralelos.
Adicionamos o recurso experimental de suspensão parcial para melhorar o desempenho de grandes estacas não estruturadas.
Melhorias no desempenho das consultas:
Aprimoramentos na fase estreita da esfera e da cápsula.
Aprimoramentos na transformação da camada de consulta geral e no tratamento de escala.
Depurador visual do Chaos (CVD):
Velocidade de carregamento aprimorada para cenas com grande número de atores e geometria complexa.
Alterações de qualidade de vida e melhorias na consistência do depurador de tempo de execução.
Ativos de física de fluxo de dados:
Suporte inicial para a criação de ativos de física usando gráficos de fluxo de dados.
Muitas alterações e correções de qualidade de vida em todo o conjunto de recursos de simulação.
Cache do Chaos
Na Unreal Engine, o Cache do Chaos é um sistema dentro da estrutura Chaos Destruction que registra e reutiliza simulações de destruição complexas, melhorando significativamente o desempenho e habilitando resultados consistentes e previsíveis para funcionalidades como curtas-metragens. Você gerencia o armazenamento em cache usando um gerenciador de cache do Chaos, que registra os dados de física em um ativo de coleção de cache do Chaos.
Esses dados armazenados em cache podem ser reproduzidos no tempo de execução para exibir a destruição sem recalcular toda a simulação, tornando cenas complexas mais eficientes e menos exigentes em termos de hardware.
As atualizações da UE 5.7 incluem:
Suporte à malha equivalente-raiz da coleção de geometrias: o cache do Chaos agora é corretamente compatível com malhas equivalente-raiz, e passará a usá-las dependendo do estado de destruição do ativo da coleção de geometrias sendo armazenado em cache e reproduzido.
Incremento automático de ativos de cache: o gerenciador de cache do Chaos agora tem uma opção para criar automaticamente um novo ativo sempre que iniciar uma nova sessão de gravação.
Controles de início/parada de sessão: agora você pode controlar quando a sessão de cache é iniciada e interrompida. Por padrão, a sessão de cache começa quando o evento BeginPlay é acionado para o ator do cache (geralmente ao iniciar o JNE ou a simulação). Está disponível uma opção para desabilitar esse comportamento, exigindo que você acione o início da sessão usando as funções de início e parada do Blueprint.
Funções de componentes observados: as funções de Blueprint agora estão disponíveis para adicionar, atualizar, remover ou limpar componentes observados de um ChaosActorManager específico.
Principais correções de erro:
Agora, ao gravar uma coleção de geometrias em cache duas vezes durante a mesma sessão, os eventos são sempre registrados corretamente na segunda vez.
Agora, ao reproduzir um cache no modo de reprodução, a interface de dados do Niagara para Chaos Destruction sempre aciona eventos de rastreamento durante a reprodução, conforme pretendido.
Chaos Hair
A iniciativa cabelo e groom concentra-se na criação de um pipeline de simulação robusto para que o cabelo tenha um comportamento realista usando fluxo de dados, malhas esqueléticas e splines de guia. O sistema permite simulações orientadas por animação, mesclagem entre fios cinematográficos e simulados, além de funcionalidades avançadas de criação, como deformadores de guia e ferramentas de pintura.
Os fluxos de trabalho processuais do ativo de groom se beneficiam da atualização da UE 5.7 para o aprimoramento geral do editor de fluxo de dados. Aprimoramos os nós correspondentes para proporcionar uma configuração mais flexível:
Nós com reconhecimento de seleção:
A maioria dos nós aceita uma seleção, o que resulta em uma configuração mais controlada e direcionada.
Você pode usar os nós de seleção existentes para outros ativos (Destruction, Flesh) para criar conjuntos de seleção e manipulá-los proceduralmente.
Desempenho:
Ativos de tratamento com geometria complexa geram a geometria para a janela de visualização de construção mais rapidamente e agora armazenam as informações em cache para evitar que sejam recalculadas.
Isso se aplica a outros nós baseados em coleções nos editores de fluxo de dados.
As atualizações da UE 5.7 incluem:
Simule cabelos com splines de guia acionadas por animação e física.
Mesclagem entre estados animados e simulados proporcionando realismo e controle.
Compatível com atributos de pintura, ponderação de revestimento e troca de guias.
Chaos Fluids
O projeto Fluids continua a expandir os recursos de simulação de água da Unreal Engine, com esforços direcionados no UE 5.7 para o plugin Advanced Water, principalmente melhorias para simulações de rios com incorporação.
As atualizações da UE 5.7 incluem:
Compatibilidade com texturas virtuais.
Melhoria da qualidade da superfície (menos artefatos de picos).
Diversas correções de bugs e aprimoramentos de desempenho.
Produção virtual
Pré-visualização de dados do Live Link
Agora é possível pré-visualizar dados do Live Link na janela de visualização do editor sem precisar preparar nenhum ator ou malha do esqueleto. O ator de Pré-visualização de dados do Live Link exibe todos os seus dados de funções de animação, transformação, câmera e marcador em um único ator prático.
Também foram fornecidos componentes de ator para ferramentas utilitárias personalizadas no editor. O Gerenciador de Captura de Movimentos usa esses recursos para visualizar seus dados do Live Link.
Gravação robusta do Live Link Hub
Aprimoramos a robustez das gravações no Live Link Hub para suportar variações no tamanho dos dados de um assunto ao longo do tempo; por exemplo, quando o rastreamento de um assunto é perdido e depois recuperado durante uma gravação.
É possível atualizar gravações de versões anteriores para o novo formato usando a opção do menu de contexto (clique com o botão direito) na lista de gravações.
Componente de transmissão do Live Link
É possível adicionar o novo componente de Transmissão do Live Link a atores em seu nível e transformá-los em assuntos do Live Link, permitindo que outras máquinas na rede local recebam animações deles. O componente de transmissão de suporte às funções de Transformação, Câmera e Animação.
Esse novo componente possibilita fluxos de trabalho em que se usa um projeto leve da Unreal Engine para redirecionamento de esqueleto, transmitindo em seguida a pose resultante para outros projetos do Unreal Editor na rede; tornando a UE o software de criação de conteúdo digital de redirecionamento. A taxa de quadros da animação transmitida é igual à taxa de quadros do thread de jogo.
Fluxo de dados com pausa do Live Link
Agora é possível pausar e retomar dados de assuntos do Live Link no painel Live Link e no Live Link Hub. É possível pausar assuntos individualmente ou em grupos.
Também há funções de código em Blueprint para controlar a pausa a partir de suas ferramentas personalizadas do editor. O Gerenciador de Captura de Movimentos agora utiliza essa API para controlar a pausa dos assuntos.
Dispositivo do Unreal Editor no Live Link Hub
Em versões futuras, a funcionalidade do dispositivo de gravação do Switchboard será migrada para o Live Link Hub para configurações de captura de movimento multiusuário. Na UE 5.7, o Live Link Hub agora permite controlar o slate e o início e parada das gravações do Gravador de Tomadas em clientes do Unreal Editor conectados, por meio de um novo plugin experimental chamado dispositivo Live Link Unreal.
Essa nova abordagem aumenta a robustez das gravações com vários clientes, substituindo o antigo sistema de mensagens OSC usado pelo Switchboard, além de oferecer controle manual ao usuário sobre o que cada cliente deve gravar e quais clientes têm permissão para gravar.
Anexação dinâmica de adereços no Gerenciador de Captura de Movimentos
Ao fazer o redirecionamento da captura de movimento, muitas vezes há deslocamentos entre as mãos da pessoa artista e as mãos do personagem com movimento capturado. Isso gera um problema ao tentar alinhar adereços rastreados com o personagem.
O novo componente anexação dinâmica de adereços oferece uma maneira de controlar um adereço com dados de captura de movimento, adicionando um deslocamento dinâmico para mantê-lo corretamente nas mãos do personagem.
Agora, o componente PCapProp apresenta uma função substituível em Blueprint que permite aos usuários escrever sua própria lógica de anexação dinâmica. Uma implementação de exemplo é fornecida no Gerenciador de Captura de Movimentos, adequada para a maioria dos adereços de uma única mão.
Criação aprimorada de malha de artista no Gerenciador de Captura de Movimentos
Para obter o resultado de redirecionamento mais preciso, usar uma malha do esqueleto dimensionada conforme as proporções dos dados do Live Link da pessoa artista é uma boa prática.
Aprimoramos o fluxo de trabalho no Gerenciador de Captura de Movimentos para criação desse ativo, tornando-o compatível com estágios em que a origem não esteja posicionada de forma conveniente e com sistemas que utilizam sistemas de coordenadas de mão direita.
Composure
A Unreal Engine 5.7 reintroduz o Composure como um sistema moderno para composição em tempo real, compatível tanto com entrada de vídeo ao vivo quanto com placas de mídia em arquivo ou imagem. O novo Composure é uma ferramenta baseada em camadas, com diversas melhorias em relação ao sistema legado, incluindo:
Uma experiência de usuário redesenhada e um fluxo de trabalho simplificado.
Integração eficiente de sombras e reflexos para filmagens live-action usando passagens de renderização personalizadas.
Um chaveador (keyer) aprimorado.
Perfil de mídia
Historicamente, o gerenciamento de entrada e saída de vídeo ao vivo na UE exigia múltiplos ativos (origem de mídia, reprodutor de mídia, textura de mídia, entre outros) para estabelecer todo o fluxo de captura e exibição. O perfil de mídia busca consolidar esses elementos em um único ativo de configuração para uma determinada máquina, além de oferecer diversas melhorias de fluxo de trabalho, como:
Adicionar dinamicamente múltiplas origens de mídia e saídas de mídia, selecionando a opção de hardware desejada (por exemplo, AJA, Blackmagic, NDI).
Visualizar simultaneamente múltiplos fluxos de entrada e saída.
Capturar a saída de mídia.
Configurar código de tempo e genlock com retorno imediato.
Acessar facilmente as funcionalidades de entrada e saída de vídeo em ferramentas relacionadas, como o Composure, com um único clique.
Proteção contra travamentos do Gravador de Tomadas (experimental)
A atualização 5.7 da UE adiciona suporte à proteção contra travamentos durante as gravações do Gravador de Tomadas. Agora é possível configurar o Gravador de Tomadas para dilatar a velocidade de gravação a fim de evitar perda de dados. Se um quadro estiver prestes a ser descartado, o Gravador de Tomadas pode ajustar a avaliação da engine para permitir que os dados sejam gravados antes de retomar o tempo normal.
Grave dados completos com mais confiabilidade.
Visualize áreas de preocupação onde a integridade dos dados pode ser comprometida.
Tome decisões informadas em tempo real sobre a qualidade de suas gravações.
Widget de Texto editável de tokens de nomenclatura
Adicionamos um novo widget de Texto editável de tokens de nomenclatura em slate e UMG, com suporte direto a tokens de nomenclatura. Agora é possível criar facilmente ferramentas de pipeline com suporte a tokens de nomenclatura. Quando focalizada, a caixa de texto exibirá a string de {token} não avaliada. Quando confirmada, a caixa de texto mostrará o texto do resultado avaliado.
Pesquisa e preenchimento automático de {tokens} diretamente da caixa de texto.
Veja imediatamente o valor do token avaliado diretamente na caixa de texto.
Disponível com o plugin Tokens de nomenclatura.
Modelos de linha do tempo para esquemas de montagem cinematográfica
Os esquemas de montagem cinematográfica agora podem fazer referência a sequências de níveis e montagens cinematográficas existentes como modelos para a linha do tempo do Sequencer. É possível especificar um modelo de destino e recriar essa linha do tempo sempre que uma nova montagem cinematográfica for criada usando o esquema.
Projete seu cronograma básico com antecedência.
Reduza a repetição e os erros criando tomadas, cenas, sequências de iluminação e muito mais.
Disponível ao usar o plugin de ferramentas de montagem cinematográfica (CAT).
Montagens duplicadas com substituição de referência
Agora você pode duplicar montagens em um novo local com substituição de referência. Não é mais necessário criar, renomear e fazer manualmente uma nova referência a subsequências ao duplicar uma montagem.
Duplique em um novo local e renomeie automaticamente com base em metadados e tokens de montagem.
As sequências são duplicadas, renomeadas e novamente referenciadas de maneira procedural para garantir que nenhuma referência seja deixada para trás, alterando todas as suas tomadas antigas.
Acessível facilmente a partir de um assistente limpo e simples.
SMPTE 2110 — Suporte a Nvidia Rivermax BlueField-3
O plugin Nvidia Rivermax na Unreal Engine 5.7 é compatível com as DPUs BlueField-2 e BlueField-3 com funcionalidade validada no nDisplay para efeitos especiais na câmera.
Atualizações de SDK de Plataformas
Windows
Visual Studio 2022 v17.14 ou mais recente
Windows SDK 10.0.22621.0 ou mais recente
LLVM Clang
Mínimo: 18.1.8
Preferencial: 20.1.8
Intel OneAPI
Mínimo: 2025.2.0
Preferencial: 2025.2.0
.NET 8.0
Versão de IDE com a qual a estação de compilação é feita
Cadeia de ferramentas do Visual Studio 2022 17.14 14.44.35207 e o SDK do Windows 10 (10.0.22621.0)
Xcode 15.4
GDK
Windows SDK mínimo: 10.0.22000.0
GDK: abril de 2025
Versão de recuperação mais recente
IDE compatível: Visual Studio 2022
Linux
Desenvolvimento de Linux nativo
SO recomendado: Ubuntu 22.04, Rocky Linux 8 ou mais recente, Redhat Linux 8 ou mais recente
Compilador: clang 20.1.8
Cadeia de ferramentas de compilação cruzada: v26 baseada em clang-20.1.8
Observação: para a Unreal Engine no Linux, os usuários precisam atualizar o sistema operacional ou usar SDL3. Consulte mais informações em Updating Unreal Engine on Linux to SDL3
macOS
SO recomendado: macOS Sonoma 14 mais recente
SO mínimo: macOS Sonoma 14.0
Xcode recomendado: 15.4 ou mais recente
Xcode mínimo: 15.2
macOS SDK compatível: 14 e mais recente
Observação: as versões compatíveis do Xcode foram rebaixadas do UE 5.6 devido a problemas de compilação e vinculação ao usar as versões mais recentes.
iOS/tvOS/iPadOS/visionOS
SO recomendado: macOS 14 Sonoma mais recente
SO mínimo: macOS Sonoma 14.5
Xcode recomendado: 16.1 ou mais recente
Xcode mínimo: 15.4
Versões compatíveis do SDK:
Versão do SDK para iOS: 15 ou posterior
Versão do SDK para iPadOS: 15 ou posterior
Versão do SDK para tvOS: 15 ou posterior
visionOS 2.4 com Xcode 16.3 é recomendado
Observação: a v2.5 e x16.4 foi aprovada em um teste muito limitado e provavelmente é válida. As versões até v2 e x16 provavelmente funcionarão.
API gráfica de iOS: Metal 2.4 a 3.1
Outras notas
O Shader Model 6 (SM6) exige macOS 15. Este suporte está em versão Beta e não o recomendamos para produção neste momento.
Android
Android Studio Koala 2024.1.2 29 de agosto de 2024
NDK r27c do Android
SDK do Android
Recomendado: SDK 34
Mínimo para compilar a UE: SDK 34
SDK alvo padrão para distribuição: SDK 34
Nível de SDK de instalação mínimo: SDK 26
AGDE v23.2.91+ é recomendado se você estiver usando depuração AGDE, pois essa versão contém uma correção para um erro de SIGBUS.
Ferramentas de compilação: 34.0.0
Se você tentar usar a 35.0.0, pode ter problemas se estiver usando aidl no Windows. Corrigido na 35.0.1.
Tempo de execução Java:
OpenJDK 21.0.3 2024-04-16
Ambiente de tempo de execução OpenJDK (compilação 21.0.3+-12282718-b509.11)
VM de servidor de 64 bits OpenJDK (compilação 21.0.3+-12282718-b509.11, modo misto)
Outras notas
A UE foi atualizada para usar Gradle 8.7 e a versão do AGP (Android Gradle Plugin) que usamos foi atualizada para a versão 8.5.2. Se estiver usando o Android Studio para depuração, recomendamos usar o Android Studio Koala. Ladybug também funciona, mas não atualiza o Gradle e o AGP a partir das versões acima.
Ao escolher seu nível de NDK, você deve tentar android-26, que oferece suporte a Android 8.0+.
SOE
1.18.1.2-47370208
Steam
1.57
Interruptor
Versão de SDK padrão: 20.5.6
Versão de firmware padrão: 20.1.0 a 2.2
Versão de SDK mínima: 18.3.1
Versão de firmware mínima: 18.1.0 a 1.0
Nintendo Package Manager: 1.7.0
IDE compatível: Visual Studio 2022
Switch 2
Versão de SDK padrão: 20.5.6
Versão de firmware padrão: 20.1.0 a 2.2
Versão de SDK mínima: 19.3.5
Versão de firmware mínima: 19.1.0 a 1.4
Nintendo Package Manager: 1.7.0
IDE compatível: Visual Studio 2022
PS4
Orbis SDK padrão: 12.508.001
Orbis SDK mínimo: 12.008.011
Software do sistema: 12.508.001
IDE compatível: Visual Studio 2022
PS5
Prospero SDK padrão: 11.00.00.40
Prospero SDK mínimo: 10.00.00.48
Software do sistema: 11.00.00.43
IDE compatível: Visual Studio 2022
ARCore
1.48
ARKit
4.0
OpenXR
1.1.46
Os tempos de execução do OpenXR 1.0 e 1.1 são compatíveis; qualquer um dos dois pode ser desabilitado nas Configurações de Projeto.
Notas de Versão
AI/ML
Neural Network Engine (NNE)
New:
Added multi-task support to the IREE CPU backed NNE runtime.
Upgraded IREE to version 3.5.0. for NNE plugin NNERuntimeIREE.
Animation
Animating in Engine
New:
Added a 'Tolerance' To the ControlRigPoseMirrorSettings Project settings that is used to match Controls also by position in rest pose. We still match by the Mirror table first, and fallback to position based matching. We also now cache the tables and reset them if a mirror table property is changed.
Improved Anim Details
UX Editing multiple values no longer displays the first property value.
Releasing focus on multiple values no longer sets the first property value.
Shift clicking to the left of a property name no longer resets the property.
Added support for math expressions with multiple operators.
Removed support for =operator syntax, instead use operator =, e.g *=3 to multiply the current value by 3.
No longer show parent controls of the current selection, avoiding showing too many channels when a selected control has hosted channels.
Now follows the same order as Sequencer for non Control Rig properties
Now uses meta data of Control Rig elements and Object Properties that sequencer controls, value ranges are now displayed and respected.
Selected Anim Details properties now navigate to their value widget when pressing tab.
Animator Kit:
Added a new Locator utility rig.
Adding static mesh locators and materials.
Curve Editor:
The Set Start Playback Range and Set End Playback Range shortcuts now work in the Curve Editor as well as Sequencer.
A new preference, Panning Mouse Button, allows you to choose whether right or alt-middle mouse button, or both should be used for panning the curve editor view. Also, alt-right now always zooms in/out.
The Next Key and Previous Key shortcuts now work in the Curve Editor as well as Sequencer.
Ensured we load an animation instead of trying to just find the package before we "Bake To Animation" so that it doesn't try to create a new asset.
Updated AnimationEditorUtils.cpp
Bug Fix:
Deleting a Bool channel can no longer set the key at another time if AutoKey and KeyAll is on.
No longer adds anim layers to level sequence unless needed.
Constraints now work with Pivot Tool.
Fixed shift click so it always goes to the last selected object, added a hot key to toggle pivot and motion trail modes.
Made sure to automate tangents when baking.
Made motion trails enter/exiting undo/redoable.
Motion trails can be selected without a focused viewport.
Made sure Rotator/Location/Scale controls have a curve color
Pose library can paste onto hidden control rigs
Made the AnimSequencerExport Blueprint type
Anim Details:
Properties now reset their values to the initial value of controls when clicking reset to default.
Now also displays properties that reside within a Shot Track.
Fixed navigation not working in some cases.
Fixed an issue in Anim Details where selecting a component in a plain location, rotation or scale control would not select the control in Curve Editor.
No longer shows objects if keys are selected only.
Fixed property value widgets are losing focus while scrubbing if a blueprint actor is controlled.
Fixed in some cases editing Anim Details properties creates more than one undo step.
Fixed Anim Details options no longer showing when reentering animation mode
Fixed an issue where Anim Details displayed the actor or component name instead of the track name for attributes.
Curve Editor:
Fixed issues where bezier curves were not always painted correctly.
Fixed an issue where curves were not painted when none of its keys were visible.
Fixed an issue where linear pre-/post-infinity extrapolation was not always painted correctly
Baking keys with a value different than 1 would increase range
Fixed an issue where pre-/post-infinity was not painted correctly when the first or last key's tangent mode was linear and pre-/post-infinity interpolation was linear
Fix an issue where curves flicker hovered and unhovered while editing
Motion Trails:
Made sure the Motion trail state stays on with asset reload.
Fixed strobing frame coloring with dashed by setting the start frame to be eval range start so it doesn't change when view range changes.
Fixed crash when drawing HUD since trail may not be updated due to how the hud draws. Clean pin state in UI when using modifiers.
Fixed an issue where changing additive animation modes with root motion on causes inconsistent root position when going from an additive mode to none.
Fixed a bug where starting an animation with a non-zero playback time (like rewind debugger can do) would cause an incorrect root position.
When merging sections no longer see if it's in range, just extend it so we can match up how it works without the merge.
Now only compensate from the game thread.
Can now set or add keys when recording control rig keys, previously we would just add keys causing duplicates.
Anim Layers:
Bake Fix for absolute with additives when doing per frame bakes.
Make Name Column not shrink when shrinking
Layers show up when added to sub sequence
Keep track of open anim layer UI on the anim layer asset data.
Fixed duplicate/merging control rig sections when the channel layout is different between sections.
Made generic vector channel data display more robust for position/rotation/scale control types. This also fixes the euler curve filter not recognizing rotation keys coming from Rotator control types.
Sequencer: When baking to control rig, the animation track is now disabled instead of the individual sections.
Turn off throttle when mouse button is pressed not just on drag so scrub time doesn't throttle in sequencer/curve editor
Space Switching: Remove extra keys when clicking a space key by checking to see if we are changing into the same space in which case we can delete the extra key and the space key
Hosted channels are no longer enabled if the parent is not enabled, this breaks selection. Also fixed anim layer selection with static meshes
Sequencer: The scrub shortcut (b) now properly works in the viewport, Sequencer and Curve Editor.
Fix Pivot square scale in different FOV's.
Force LOD to 1 when ticking skel meshes when baking anim sequences. Sequencer may restore state which can change the lod during the bake process.
Pivot Tool: Pivot render works in different FOVs
Animation Kit:
Added aim option for blendParent. Changed control shapes to not be solid.
Fixing bad root attachment when no control rig exists.
Fixed an issue with the recompute mesh normals kernel used by Deformer Rigs in the Animator Kit plugin causing unexpected changes to mesh normals even if they are not influenced by deformer.
Can no longer do space compensation from nongame thread which can happen when deleting many channels, in which case we probably don't want to compensate anyway
Pose Library fixes, use alt drag for non additive drags and for additive it goes from -1 to 2.
Blending and additive mode are now working on mirror.
Space Switching: Fix for undoing space switch key deletion.
Tools such as snapper, trails and baking now work better with spawnables in nested subsequences
Character Customization (Mutable)
New:
Added component naming support for spawned groom components.
Debugger improvements:
Added support for Dataless parameters.
Unified Debugger and Editor compilation options.
Reordered some widgets for better use of the available space.
Minor API improvements:
Actor:
Added ACustomizableSkeletalMeshActor::GetCustomizableObjectInstance.
Added ACustomizableSkeletalMeshActor::GetSkeletalMeshComponent.
Override Materials
Deprecated UCustomizableObjectInstance::GetOverrideMaterials(int32).
Added UCustomizableObjectInstance::GetSkeletalMeshComponentOverrideMaterials(FName).
Restricted Passthrough Mesh Component to only support Skeletal Meshes.
Bug Fix:
Fixed Material Parameter assert.
Fixed Default Values not exposed to Blueprint.
Fixed Skeletal Mesh Parameter morph check.
Fixed UpdateSkeletalMeshAsync missing parameters.
Fixed Materials comparison for merging.
Fixed Textures and Meshes not being properly cached, their hash was not deterministic.
Fixed a compiled API typo.
Fixed multiple Dataless bugs:
Crash with Default Material parameter.
Crash with Dataless Morphs having names but no data.
Fix Texture Parameter not cropping images with layout operations.
Fixed issues with GenerateMutableSourceImage cache.
Added missing COI Contains API functions.
Fixed public API Enum Parameter functions not working with the first parameter.
GetEnumParameterNumValues
GetEnumParameterValue
Fixed deadlock when saving an asset + compiling a CO while asset registry was loading.
Fixed streaming crash when no indices.
Fixed meshes incorrectly reusing poses.
Deprecated:
Removed deprecated 5.6 API functions.
Control Rig
New:
Update default hotkeys and related functionality:
Set Solve Mode: Construction Event - 1
Set Solve Mode: Forwards Solve - 2
Set Solve Mode: Backwards Solve - 3
Set Solve Mode: Backwards and Forwards - 4
Set Next Solve Mode - M
Enable profiling- P
Show Controls as Overlay - U
Display Nulls - G
Display Socket - H
Display Axes for selection - J
Using hotkey for Profiling (P by default) now creates an undo step.
Function nodes from other assets now show the asset name instead of the asset path.
Flagged Render MorphTarget MaxBlendWeight CVar as safe for render thread, in order to avoid some warning logs.
Made the animation show flags of the control rig editor never clip off of the viewport toolbar.
Fixed duplicated Control Rig assets not resetting the asset variant ID.
Control Rig Hierarchy no longer reserves transform space for non transform elements (curves and connectors).
Control Rig Physics
Moved to its own experimental plugin, though it still requires the Physics Control plugin as well.
Added ability to import collision shapes and bones
Support for "wind turbulence"
Support for colliding against world objects
Add various cvars under controlrig.physics
Numerous improvements, especially access to functionality, and fixes
Removed top level component concept from Control Rig Hierarchy
Added GetSocketTransform
Modular Control Rig:
Adding plugin Icon for Modules
Improved backwards solve for Foot Module.
Added Module tags and Root56 module to the correct ini files.
Dragging a rig element onto the graph now offers an option to Get Metadata and Set Metadata.
Update default settings and remember them per editor per user:
Display Axes On Selection is now enabled by default.
Display Axes On Selection, Axis Scale, Display Nulls, Display Sockets, Gizmo Scale, Hide Control Shapes, Show Controls as Overlays, Only Select Rig Controls are now saved per editor per user.
Control Rig now only performs one copy of the hierarchy during initialization.
Added line trace unit nodes.
Added icon to plugin.
Added Damp and Critical Spring Damp nodes to Control Rig.
The Control Rig menu now shows directly in the viewport toolbar instead of being a submenu in the Show menu (eyeball icon).
Nodes and hierarchy elements now offers options to find nodes by name locally and globally.
Updates to Set Initial Transform from Current and related Commands
Set Initial Transform from Current is now only applicable for Bones, Nulls and Connectors.
For Controls, Set Initial Transform from Current is now Zero Controls.
For Controls, Set Initial Transform from Closest Bone is now Zero Controls from Closest Bone, and no longer applicable for Bones, Nulls and Connectors.
Set Shape Transform from Current is now Zero Control Shape.
Bug Fix:
Moved findItemsWithTag to the construction event for performance.
Fixed Control Rig curve container undo / redo breaking the curve list
Fixed Control Rig editor resetting on compile curve operations made on the curve container (delete, rename, and import).
Fixed a crash in Control Rig Pose adapter when removing bones from the skeleton while having a Blueprint with a Control rig opened in the asset editor.
Fixed AnimNode Control Rig variable mappings initialization at OnInitializeAnimInstance.
Control Rig: Need to update Rotation Order table with modular rig updated names.
Fixed Control Rig Hierarchy updating more transforms than needed in propagate dirty flags function.
Modular Control Rig
Added twist to legs.
Fixed IK/FK naming.
Added back public function from arm to leg so it picks up changes.
Fixed hind legs ik fk.
Changed leg and arm softness to off by default.
Fixed socket tooltip in Spine.
Fixed HindLeg FK controls not rotating.
Fixed AnimalNeck stretch.
Fixed Shoulder backwards solve by parenting to chest null instead of body ctrl.
Fixed HindLeg to always use connectors for creation instead of parent lookup.
The editor now retains the Rig Solve Mode after compiling.
Fixed Control Rig control module iterator lambda parameters creating copies of some expensive objects.
Fix for client crash in FRigUnit_HierarchyInstantiateFromPhysicsAsset, due to Modular Control Rig object overrides getting garbage collected.
Fixed ControlRig Hierarchy serialization not storing the previous hierarchy name map.
Fixed crash in Control Rig editor when the preview floor mesh is not available, now it will trigger an error log and continue to load the asset.
Avoid a crash in Control Rig when adding an empty rule to a connector.
Fixed an editor undo redo in an AnimBPs that contains a Control Rigcrash, when performing a redo of a previously-undone SetPreviewMesh transaction.
Anim In Engine: Rotator control keys are retained in Sequencer when the controls are changed to transform controls in the rig.
Need to update Constraint Channels with updated Modular rig names, or constraints come in broken.
Fixed ControlRig editor not executing post undo for the transient editor preview actor.
Fixed undo / redo crash in Control Rig hierarchy mappings, when undoing across a construction transaction.
Converted HandleExecutionReachedExit event to function callback, to avoid worker thread contention.
Fixed ControlRig spawn control node details panel not generating the shape name list as a combo box.
Fixed a crash in ControlRig when expanding a function reference from a different graph that contains a private function inside. Now the user will receive a localize request to make a local copy of the function.
Fixed RigVM local variable customization not showing value for local variables not used in the graph and losing value after compiling.
Deformer Graph
New:
Adding Deformer dynamically in Control Rig was changed to use Async Loading to avoid hitches when the Deformer loads.
Enabled Compute Framework/Deformer Graph on mobile platforms.
Fixed SkinWeightAsVertexMask Date Interface providing incorrect data when a non-default skin weight profile is used.
Fixed skeletal meshes getting invalid tangents when using deformer graph with opengl_es31.
Fixed wrong category for a few deformer functions.
Added a pre-built dual quat deformer that supports both morph and cloth.
Bug Fix:
Made sure skin weight profiles are requested earlier so that we can avoid T-Pose on the frame that the deformer becomes active / LOD changes.
Fixed copy pasting resource node with matrix3x4 type creating a node with no pin.
Fixed an ensure related to deformer graph instance settings in packaged build caused by incorrect object name used when creating the settings object.
Gameplay
New:
Make Motion Warping switchoff conditions and warp target direction mode experimental as these APIs will change in future.
Added support for animation mirroring to UAF.
Note this is a first pass and not fully matching Animation Blueprint's capabilities yet.
Added a new version of AddAnimationNotifyEvent() that supports blueprint exposed data from notify events.
This helps prevent data loss when copying/duplicating animation notify events.
Add SmoothWalkingMode to Mover2.0
Added base class SimpleWalkingMode to help make writing walking modes easier.
Renamed AnimationMath -> SpringMath and made public Rename SpringWalkingMode -> SimpleSpringWalkingMode.
Added Velocity Spring functions to SpringMath Add character prediction functions to SpringMath.
Added documentation to SpringMath.
Added support for PoseSearchDatabase searches returning multiple results
Added experimental support to the motion matching node (FAnimNode_MotionMatching) for interaction searches (multi character motion matching, to mimic FMotionMatchingTrait).
Added a custom make bp function for FMotionWarpingTarget to ensure that the custom actor is called to calculate the target transforms when a component is passed as an input.
The ChooserTable randomization column can now keep track of multiple recently selected entries and reduce the probability of reselecting them.
Added new Chooser table column type (FPoseSearchColumn) to support motion matching searches within chooser evaluations.
Add a spring walking movement mode to Mover named "SimpleSpringWalkingMode". This uses a critically damped velocity spring model to translate and rotate the character.
Removed UE 5.5 deprecations from PoseSearch plugin.
Exposed anim to texture editor functions as a public interface.
Add threadsafe method for getting curve asset float & vector values.
Bug Fix:
Fixed UE::PoseSearch::SDatabaseAssetListItem potentially referencing a deleted asset.
Fixed a crash when opening the PoseSearchInteractionAsset editor.
Fixed FSearchContext::GetSampleRotationInternal and FAssetIndexer::GetSampleRotation not properly calculating the rotation relative to their reference bone.
Fixed motion matching tracing during throttled or skipped searches.
Stored FBlendStackAnimPlayer::StoredAttributes as FMeshAttributeContainer instead of FHeapAttributeContainer to support animation LOD changes in blend stack.
Fixed a pose search database indexing crash when using a UAnimNotifyState_PoseSearchSamplingAttribute referencing a bone that is missing from any channel included in the pose search schema.
Fixed root motion sampling in blend stack.
Fixed the motion warping switchoff condition to use the correct target transform when component following ends.
Fixed a crash in UPoseSearchFeatureChannel_Phase::IndexAsset when indexing assets with a single pose, usually caused by a very short animation in a pose search database.
Fixed UPoseSearchDatabase::SynchronizeWithExternalDependencies mistakenly synchronizing transient assets into a database, leading to reference garbage collected assets.
Removed notify guids from Pose Search Database hash generation, otherwise the hash can be non-deterministic.
Fixed a crash in FAsyncPoseSearchDatabasesManagement::CollectDatabasesToSynchronize with Objects with invalid Object->GetClass().
Fixed the Alias state nodes not working with getters like GetRelevantAnimTime.
Deprecated:
Deprecated UPoseSearchDatabase TArray AnimationAssets in favor of TArray DatabaseAnimationAssets.
Deprecated UPoseSearchLibrary::UpdateMotionMatchingState.
ML Deformer
New:
Hide certain conflicting properties (categories even) from the advanced preview scene settings tab. This was needed because the MLD asset editor has its own mesh picking and animation playback. Changing those properties inside the preview settings tab would mess things up. So we now hide those specific conflicting settings.
Make curves work with UAF.
Added support for copy paste between input bone and curve lists.
Means users can copy/paste the input lists from one model to the other.
You can now right click the input list widgets and choose Copy and Paste.
Fixed a few bugs in the tooltips as well as unique curve group name generation.
Improved the UX a bit by setting a minimum height for the bone, curve, bone group and curve group widgets and some context menu improvements.
Fixed some UI refresh issues as well when adding bones or curves. Curve group and bone group coloring did not refresh properly.
Improved performance of the asset editor. Improved responsiveness to property changes, faster loading, faster sampling of anims.
Added a new console command "MLDeformer.DebugDrawInputPoses" which will draw the input pose to the ML Deformer. It can be useful to quickly visually see what meshes have ML Deformers on them, and what bones are included.
GeomCache: Some improvements to the memory management. Prevented reallocs, resulting in faster performance.
Bug Fix:
Fixed a problem where training with curves would cause a failure during training.
Fixed a bug where curves on the skeletal mesh instead of on the skeleton would cause some error checking to fail.
Fixed a crash when adding a bone to the inputs of the ML Deformer.
Fixed a crash on undo on morph based models. Also changed the icon of the Train button.
Fixed python errors when launching with "-game" as argument.
Fixed a bug when training, related to masks of input animations. Training would fail with some error right after sampling.
Moved the tick group from pre physics to post physics.
Fixed a VertexDeltaModel python import error. This was because an import should have been inside the Train function, but it was in global scope.
Fixed async loading issues.
Some fixes where it would not detect curves.
Physics Control
New:
Now supports using a mask when invoking control profiles, which means they can be applied to a subset of the character.
Additional support for specifying control/modifier set names in function calls.
Kinematic targets are now specified the same way across PhysicsControlComponent, RigidBodyWIthControl and ControlRigPhysics.
Fixed duplication of the Linear/AngularTargetVelocityMultiplier and TargetVelocityMultiplier parameters.
Bug Fix:
General minor fixes/improvements to the physics control asset editor, including a fix for a potential crash.
Runtime
New:
Added pinning and toolbar to workspace viewport and remove scene description tab.
Now supports drag/dropping multiple bones in the abstract skeleton binding editor.
Bone items can now be dropped onto non-set items in the abstract skeleton set binding editor.
Added a filter for attributes to anim asset browser.
Added Initialize as a default implemented event in the UAF module.
State Machine: Self transitions & UX improvements:
Self transitions and state re-entry are now possible.
Re-entering a state uses inertial blending and requires an inertialization node. Old content will not use the new re-entry feature but any newly built content, when re-entering a state, will create an error if an inertialization node is not present root-wards in the graph.
The target state must enable bAlwaysResetOnEntry for the inertial blend to trigger.
To aid with managing state-reentry, a new MinTimeBeforeReentry value has been added to transitions.
Added 'reverse transition' context menu option that just reverses the direction of transitions.
Relinking transitions to other states can now be performed from the transition tail as well as the head.
State alias list is now sorted alphabetically to make finding states easier.
Look and feel of state machines has been tweaked & improved.
Now uses SVG brushes to better scale.
Different node types (states, aliases and conduits) now have different shapes.
Transitions now rotate to follow their direction and have been moved closer together and closer to their link line.
Transitions now sort in front of states.
Links are now further apart and scale correctly with zoom level.
Selection of links now scales correctly with zoom level.
Details panels for states now show the anim node functions for their result node and have been rearranged.
Added 'force transition' option to the context menu for state machines that are currently being debugged.
Made machine entry nodes non-deletable.
Extended the Create Asset menu to allow non-asset menu entries for wizards that create potentially multiple assets of various types.
Added a picker widget for animation attributes.
Added toggle to blend layer trait to blend in mesh space.
Added live updating blend mask weights in the profile blend node.
Updated animation blueprint interface icon in the 'My Blueprint' tab to show as blue when the function has been implemented.
Exposed Curve Metadata API on the Skeleton to Blueprint and Python. This includes functions to query, add, remove and rename curve metadata as well as querying and setting material and morph target flags.
Disabled adding set bindings without a set collection set.
Added a viewport to the workspace for UAF.
Paused preview animation while manipulating transform widget in animation editor.
Added an asset wizard for help authoring UAF content.
Added foundations for the abstract skeleton runtime.
Added editors for the abstract skeleton assets.
Added functionality to Open in New Tab via the context menu for collapsed nodes and function nodes in UAF
Fixed collapsed nodes and functions in UAF workspaces being opened without context of their outer, leading to loss of access to variables.
Fixed debug only assert when opening items via double click the workspace outliner.
Bug Fix:
Fixed a missing drag-drop op for adding attributes to sets in the set collection editor.
Caught a situation where the mesh asset in InitializeAnimScriptInstance is invalid. Also dealt with possible parallel anim eval tasks being in flight.
Fixed a crash when trying to create a new UAF Workspace instead of picking an existing one when prompted to choose a workspace after opening a newly created UAF Graph.
Fixed slow document navigation in the workspace editor.
Fixed a crash when attempting to add an existing curve attribute to abstract skeleton binding.
Fixed being able to rearrange a trait onto itself.
Fixed for animation modifiers not reverting correctly and crashing in some instances.
Fixed a crash when re-removing a pin on a blend multi node after undoing.
Fixed a broken root motion extraction during animation modifier evaluation.
Fixed a regression in root motion extraction which prevented animation modifiers from reading raw uncompressed data during the compilation process, causing them to fail
Fixed missing text localization in pose asset widget.
SkeletonCompatibility: Fixed a problem when using compatible skeletons where we could end in a situation where the source skeleton did not have a bone of the target skeleton, which could lead to a crash.
RBAN: Ensure RBAN doesn't write NaNs into the pose.
Fixed visualization of what the blend weight of the animation is in Animation Insights for Random Sequence Player. Now it takes the overall blendweight of the animation into account as well.
Fixed the look at edit mode locator gizmo not updating location when changes are made in the details panel
Anim State Machine:
Fixed incorrect duplicate GUID warning when a transition rule is shared.
Prevented renaming states to 'None'.
Fixed copy-paste of transition nodes creating duplicate GUIDs/assets.
Fixed clamping values preventing manual entering of valid negatives.
Anim Sequence: Fixed thumbnail scene references preventing deletion when assets contain notify states.
Anim Assets: Fixed a crash when creating a preview scene for assets with a deleted compatible skeleton.
Fixed the animation sequence segment length
Fixed a button in the montage editor not working due to property access type mismatch
SkeletalMeshComponent: Fix meshes getting ticked offscreen incorrectly when using montage-related visibility options
Fixed pose history and trajectory history desync by delta time, causing incorrect results especially noticeable when the component transform makes large translation and rotation, e.g. a 180 pivot.
This fixes a bug with bad pivot selection when the capsule rotation flips
Fixed incorrect timings on trajectory history when delta time is not constant.
Fixed duplicate trajectory entries around t = deltatime.
Fixed the set collection editor not updating when renaming a set, and added rename to the context menu.
Fixed the expansion state of tree items resetting when drag/dropping a bone in the abstract skeleton binding editor.
Fixed drag-dropping segments into composite track not matching selection order.
Fixed window scaling issue when dragging multiple notifies in the animation editor.
Changed check to ensure in SkeletalMeshComponent to avoid crash using rewind debugger.
Fixed many SAssetShortcuts unnecessarily refreshing on asset opening resulting in slow ABP navigating.
Animation Budget Allocator: Enabled component tick when unregistering.
Updated the animation attribute functions to not allow adding an attribute with a name that already exists.
Anim BP: Fix cook non-determinism with generated 'mutables' struct
Anim Instance: Fix memory leak when GC-ing both mesh & anim instance in the same pass.
Fixed an issue with tooltip names in SOverrideStatusWidgets.
AnimSequence: Fix uninitialized pose transforms being generated in some circumstances
PropertyAccess: Fix memory leak when calling functions via property access that return non-POD values.
Anim Decompression: Removed usage of deprecated GetCompactPoseIndexFromSkeletonIndex.
Fixed copying notifies when duplicating an anim sequence so the new notifies no longer reference the old sequence.
Fixed the UAF asset wizard template assets being visible in the content browser and selectable in the workspace picker etc.
Added more inline crash details when invalid values are found in animation poses.
PropertyAccess: Hardened GetAccessAddress in case of unexpected data.
SkeletalMeshComponent: Fixed a crash when calling SetAnimInstanceClass during a notify callback.
Triggered caching of all otherwise lazily computed data when a DNA is loaded from a binary stream, which can avoid potential race conditions if the same DNA reader is utilized in a multithreaded environment.
Fixed not being able to move nodes within newly created comment nodes in Control Rig and UAF.
Deprecated:
Removed deprecated Skeleton Compatibility code from the Skeleton class.
Removed deprecated Curve code from the Skeleton class.
Removed deprecated Mesh Linkup Caching code from the Skeleton class.
Sequencer
New:
Property tracks can now be renamed.
Note, the tooltip will still show the actual name of the property being animated.
Added setting to always stop when going to playback start or end.
Sequencer Navigator: There are now columns for the sequence ID and the object binding ID which are useful for debugging purposes.
Take Recorder: Add a cvar TakeRecorder.AllowPossessablePIEObjects to bypass disallowing recording PIE objects as possessables. The default is to not allow this (no change in behavior). This can be useful when recording a player pawn.
Added scripting to text
Added ISequenceVisitor callbacks for when the visit enters/exists a sub-sequence
The camera cut track now supports multiple rows. When multiple rows exist, the camera cut track does not try to auto arrange sections.
MovieScene: Exposed FLevelSequencePlaybackContext to other modules.
Hot key scrubbing will continue playing if Sequencer was playing.
Preview camera cuts in simulate. This also lets users enable/disable seeing camera cuts in PIE after ejecting from the player controller.
The colors for the playback start/end range can now be customized by user settings.
Added support for notification callbacks when animating properties.
The timeline in the cinematic viewport now respects the snapping behaviors of the Sequencer timeline.
Added fixes and improvements to the time space display. The desired time space and the local time space are now both drawn.
Bake Transform now has an option to bake with time warp applied.
Attach sections with Preserve None now default to infinite duration.
'Bake Animation Sequence' and 'Create Linked Animation Sequence' actions in Sequencer now remember the last folder that was used in the current Editor run.
Bake Transform is now available in the Template Sequence and Camera Animation Sequence Editors
The subsequence section's Origin Override Location/Rotation now respect the default float/double spinbox incremental behaviors.
Sequences: Add PlayReverse function to actor sequence components.
Editing scale channels in the Sequencer Key Details now has an option to preserve the scale ratio
Save As is now available in the Template Sequence and Camera Animation Sequence Editors.
Added the ability to get and set Mute Nodes, Solo Nodes, Deactivated Nodes, Locked Nodes, Pinned Nodes, and Binding Tags in Blueprints/python.
The view and working ranges are no longer saved with the asset. Every time you open a level sequence, it will be zoomed to the playback range.
Duplicate keys are now removed on mouse release
Update tooltip to "The interpolation type for the initial keyframe" to clarify that this is only for the first keyframe on the track/section
UE_API all blueprint exposed functions for Sequencer Scripting
Bug Fix:
Refactored track instance bindings and added the concept of "volatile" paths to fix possible memory stomps when animating array items or instanced structs.
Fixed an issue where when changing shots we could sometimes get one frame of t-pose on a character when using bForceCustomMode. The issue was that we were checking for custom mode too late in the frame relative to when we were potentially doing the binding to a custom anim instance.
Fixed the color not reverting when pressing cancel on the color picker.
Added an adjustment for an issue for capturing thumbnails for sequences. Renders at a square aspect ratio and cleans up some advanced rendering features to create the cleanest image possible like materials.
When opening a sequence, the playback mode is now set to loop selection range if a selection range is set.
Fixed the BakeToControlRig function. Now fetches the templateID for the sequence that we're in so that if the sequence we are working on is a nested, instance, or template sequence we can resolve objects within the function.
Added support for indirect gizmo manipulation of sub track offsets.
Added support for animating property bag properties.
Fixed a possible GC leak with UMG animations. It happened when using an event track, and the widget is removed from its parent while the animation is playing, and then the inactive widgets pool is discarded and GC'ed.
Sequencer Navigator: The marks column now properly updates when marks are changed/added/removed.
Exporting a binding that doesn't have a valid spawnable template no longer crashes
Fixed a GC error in restore state of skeletal mesh animation track.
Properly implemented end-at-time feature.
Now stores camera shake previewers as shared pointers because FGCObject classes are not relocatable.
Fixed Material Parameter Collection track display name so that it's not set explicitly on creation. Instead, the display name is just the name of the MPC if the user hasn't changed it. This allows the user to change the MPC and the name will automatically change.
Proxy bindings no longer allow you to mistakenly pick the same actor it is a proxy for.
Key selection is no longer emptied when right clicking on the timeline.
UMovieSceneSequence: Fixed nullptr crash.
Fixed pre-roll/post-roll sometimes still evaluating sections that aren't set to evaluate there.
No longer falls back to the double blender system when a property doesn't have blending information. Instead, it falls back to the fast path where we don't blend anything.
Fixed broken support for ping-pong playback when we only cross the loop boundary once.
Fixed the pre-animated state being incorrectly saved as "persistent" for root tracks.
Deleting a muted track row now properly no longer causes other rows to lose their mute state.
When a fixed timescale is set negative, ranges 2 levels down no longer collapse causing subscenes of subscenes not to play correctly.
This only fixes the case of fixed timescale. Similar issues still occur using the playrate/timescale curve.
Copying a folder now properly copies root tracks as well.
.MovieSceneSequenceExtensions::FindBindingByName now returns a more reliable binding because it gathers the names from FMovieScenePossessable and FMovieSceneSpawnable which are kept in sync with the actor labels.
Fixed a regression with a deprecated code path for fetching what animation is playing for UMG Sequences.
Fixed pause-at-frame logic, which was sometimes incorrectly pausing on the previous frame.
Select All Keys Forward and Backward now properly select all the requested keys.
Selecting a layer bar no longer mistakenly deselects component bindings.
Collapse Nodes and Descendants now properly collapse after being expanded.
Copying a folder now properly copies all bindings and their child component bindings.
Payload objects for event keys are no longer lost.
Disallow picking a proxy binding that's already bound to the current one.
Remove the "Blocking Evaluation" checkbox from the advanced menu, since we can already set it from the playback options.
Fixed ongoing focus issues in the key details. Sequencer are now committed when focus is lost and keys are not accidentally created with incorrect values.
Fixed the time warp curve still evaluating even while muted.
Fixed a bug where the keyable indicator would not update for the selected object in the details panel after opening a sequence. It required adding to the sequence or selecting new objects.
Fixed pre-roll/post-roll sometimes still evaluating sections that aren't set to evaluate there.
Removed calling Modify from SetPreRollFrames / SetPostRollFrames. The caller should be responsible for calling Modfiy().
If you copy an event track from one sequence to another, the events in the pasted event track will point back to the blueprint director in the copied sequence. This is not allowed, so those events are now cleared.
Fixed creating an object property track as a class property in python not properly setting the bClassProperty value which allows a class chooser to pop up instead of an object chooser.
Fixed keys not selectable on multiple rows.
Restored a section model expansion state to be closed if it was before, since RestoreLayout resets it to expanded.
We now tear down the Take Recorder's Sequencer instance before we delete and GC the sequence.
Re-added dropped support for Blocking Evaluation in UMG animations.
Fixed a crash when reinitializing a Sequencer editor on a new sequence while the previous one had legacy tracks
When importing cameras, now applies a uniform scale modifier to distance based parameters (Manual Focus Distance).
No longer blends enum values, and make the byte track use the enum system when it animates an enum.
Ensured that evaluation context buffers are flipped if an eval task is active prior to forced update.
Added a potential fix for a memory corruption of UMG animation states.
The topmost unmuted Cinematic Shot is now correctly evaluated.
Previously, if a muted Cinematic Shot was topmost, it wouldn't be skipped over.
Fixed some properties that should appear to be animatable (i.e. FieldOfView and AspectRatio for Cine Camera Components).
Fixed an issue that when converting to a spawnable, sometimes the original possessable meshes were still visible.
Fixed undo of camera cut section now restoring the camera binding properly.
Fixed regression of pre/post-roll behavior in the skeletal animation track.
Creating the initial key for material tracks now respects the default interpolation type setting.
Snap play time to pressed/dragged key only if snapping is enabled.
Fixed a reference-leak in the Track Instance system.
Setting the time of a key through the Properties menu now works properly.
Keying specific channels of a transform through the Details Panel now properly sets the key with those current values (and not 0).
Fixed calls to bool property custom accessors, which were using the wrong function signature.
Better handling looping for camera cut tracks:
Added a new "HasLooped" flag on the evaluation context.
Assumes by default that looping sequences are "seamless" and do not create a straight/hard camera cut on loops.
Added an advanced evaluation flag to opt out of this assumption.
Fixed undo not working when editing with control rigs.
Now fully supports all camera and post-process properties when previewing blending camera cuts.
Disabled ensure before cleaning up camera cut track viewport modifiers.
Fixed regression in how skeletal animation sections behave when resized from the left edge.
Take the first loop start offset into account when determining if a skeletal animation section needs to loop.
Deprecated:
Deprecated FMovieSceneBinding::Name since it's redundant and not kept in sync with actor labels.
Can now return multiple objects with FMovieSceneBindingResolveResult. FMovieSceneBindingResolveResult's Object is deprecated in favor of an array of Objects.
Migrated text tracks to Movie Scene Tracks plugin (enabled by default). Deprecated MovieSceneTextTrack plugin.
Skeletal Editing
New:
Skin weight profiles can now be switched directly in the skeletal editor viewport, if there are skin weight profiles defined for the skeletal mesh asset.
Edit Weights Tool: Fixed removing weights from vertices weighted fully to a single bone turning them into unweighted vertices.
Bug Fix:
Animation: Editing the text field in the curve editor of an anim montage no longer crashes.
Editor
Datasmith
Bug Fix:
Fixed 3dsmax plugin support for 2026.
Framework
New:
Fixed GetOwnerPackages() for instanced structs inside non-complex properties.
FStructurePropertyNode::GetOwnerPackages() fails at walking up the property nodes for a specific case, and may trigger an ensure. When stumbling upon an instanced struct, GetOwnerPackages() walks up by getting the direct parent.
However, this parent is not necessarily a complex parent (can be a non-object/structure property type). To make sure the walk happens correctly, the case should be handled the same way GetInstancesNum() does (get complex parent of parent).
Added a few virtuals to cosmetic SGraphNode getters.
Useful while adding advanced styling in custom node editors. In some cases it might be possible to avoid overriding engine methods by implementing our own variants, with different names, but not in every case.
Also reusing original methods makes the programmer's intent much clearer - what part of the base class was actually overridden.
Implements experimental Capture Stealing in ITF Input Router.
Updated MathStructCustomization metadata extraction to include InstanceMetadata
This change updates metadata extraction for header row to include InstanceMetadata. It is useful when assigning metadata to Vector/IntVector types via other customizations.
UToolMenu Items will now override any parent Tool Menu Items of the same name.
Positioned Tool Menu Items that fail to be positioned will now be inserted at the end of the section.
Improved reliability of legacy SExtensionPanel support in the new viewport toolbar. Extensions are only enabled when there is enough information to support their existence.
ToolMenus: Adds options for whether a Tool Menu Entry with an insert position that can't find its target should insert anyways and/or log.
Defaults to both inserting & logging.
Disables logging if the ToggleViewportToolbar and ToggleHideViewportUI commands can't find the ToggleFullscreen command in the Level Editor Window menu.
Bug Fix:
Fixed an edge case Blueprint Editor crash on exit.
Fixed an issue where top-level toggle buttons in Viewport Toolbars looked like raised buttons.
Users can now change the derived type on default value instantiations used to initialize a base type reference member in saved instance data when using override serialization.
Fixed the asset reference filtering not working when dropping assets on Material, Niagara Script and Texture Graphs, or on nodes and pins of any asset graph type.
Fixed inconsistencies between drag and drop visual feedback and drop behavior in Animation State Machine, Sound Cue, and Texture Graphs.
Deprecated:
The old Level Viewport Toolbar Panel Extensions are now deprecated. They will be removed in a later version.
Interchange
New:
Reduced memory usage when importing static meshes.
Added a SubdivisionAPI custom schema for specifying per-prim subdivision level.
Added support for array node attributes.
Added support for subdividing static meshes and geometry caches when importing via USD Interchange.
Added more C++ UsdWrapper types and tweaked the Unreal.natvis file to improve how they're displayed on the debugger.
Upgraded MaterialX version to v1.39.3.
Textures imported with non-power-of-2 dimensions or non-multiple-of-4 dimensions were previously automatically set to NeverStream and Uncompressed. This can now be toggled with a config setting :TextureImportSettings::bDoAutomaticTextureSettingsForNonPow2Textures .
Also when textures initially imported as nonpow2 are re-imported as pow2, they now get their settings automatically fixed to the defaults for pow2 textures.
Improved the performance of importing skeletal meshes with multiple morph targets via USD Interchange.
When importing USD stages through USD Interchange, SkeletalMeshComponent prims will be spawned with AnimSequences assigned to them, if any were imported.
Added a "Use Single Bone" option to import a static mesh as a skeletal mesh with top node as the only bone.
If "Force All Mesh as Type" is set to "Skeletal Mesh" and "Use Single Bone" is checked, the imported skeletal mesh will have a unique bone at its origin called "Root".
Added a new option to the USD Export Options dialog when exporting levels to USD called "Export to Nested Sub Folders", which restores the previous behavior of exporting asset layers to a folder structure that mirrors the content folder structure
Interchange: Added support for importing OBJ into level.
Reduced memory usage when importing skeletal meshes.
Upgraded OpenUSD version to v25.08.
Interchange USD can now import groom assets and groom caches.
Added support for dome lights via SkyLightComponents when importing via USD Interchange.
Removed FNavigationOctree::AddNode Warnings during Level Import.
Implemented a Nanite triangle threshold value on the Interchange generic asset pipeline, in order to enable Nanite only for meshes past a triangle count size.
The USD Interchange translator has a new setting for collecting prim metadata as translated node user attributes. It can also specify a regex for filtering of particular metadata fields.
Refactored the LevelSequence handling for USD imports in order to properly support subsections due to references and payload arcs.
Importing via USD Interchange will now reuse generated assets when importing instanced prims.
Added support for OpenUSD on Windows ARM64.
Refactored skeleton handling in Interchange USD to not consider the skeleton prim itself as a root joint, which prevents transforms applied directly to the skeleton from being ignored in some cases.
Interchange USD imports that preserve the pseudoroot node will now produce a top-level actor named after the root layer's display name, as opposed to being always named "/"
Now uses the default static mesh collision profile for static meshes generated via the USD Stage Actor imports.
Bug Fix:
Fixed Reimport not showing skeletal mesh conflicts.
Fixed missing AnimSequence assets when importing animation tracks via Interchange that have a total length below MINIMUM_ANIMATION_LENGTH (of 1/30 seconds)
USD: Editing keys in Sequencer now properly update back to the USD Stage.
Fixed node name collision suffixes appending to previous suffixes, producing names like Cube12345
Fixed actors with identity transform being imported via Interchange with the inverse transform of their parents in some cases.
Fixed imported LevelSequences overwriting others with the same name when importing some very complex USD scenes.
Fixed cameras imported from OpenUSD with fStop of zero so that depth of field effects are correctly disabled.
Fixed incorrect skeletons being imported via Interchange FBX in some edge cases when TransformLinks seem to represent local transforms.
Fixed static mesh collider transforms being incorrect in some cases when importing into level with Interchange.
Fixed some issues with baked skinned mesh transforms when importing skeletal meshes with morph targets via USD Interchange.
Fixed how AnimSequences seemed to have no animation data after using Actions -> Import on the USD Stage Editor.
Fixed issues with using Material Search Location when importing scenes with Material Instances via USD Interchange.
Fixed automated reimports still showing the options dialog when reimporting via Interchange or USD.
Fixed metadata not making it onto actor AssetUserData when importing scenes via Interchange in some scenarios.
Now discards empty LevelSequences when importing from USD.
Fixed SparseVolumeTexture assets not being generated by USD Interchange when importing scenes with volumes if the exact same volume node shows up on the stage more than once.
Fixed a crash when trying to parse USD LodSubtreeAPI schema applied to skinned meshes.
Fixed import of UsdPreviewSurface into Material Instances for USD materials that have output connections to other shader graph or material prims.
Fixed performance bottleneck when importing many lights via USD Interchange.
Fixed some name-prefix-based collision meshes not being correctly used when importing via Interchange in some cases involving name collision.
Can now generate the desired simple collision meshes even if the shape disagrees with the provided mesh data.
Fixed morph target normals and position offsets not being skinned with geomBindTransform when importing skinned meshes via USD.
Fixed how Interchange USD was not using timeCodesPerSecond values when baking skeletal animation tracks.
Fixed incorrect vertex ordering of subdivision surface meshes imported from OpenUSD when their orientation is "leftHanded" and subdivision is enabled.
Fixed a crash when parsing some USD SkelRoots configurations with multiple Mesh prims that contain normals.
Fixed how USD asset imports were persistently disabling the "Import Into Level" option to import actors.
Fixed OpenVDB being imported via USD stages without compensation for the stage's upAxis and metersPerUnit values.
Fixed level exports to USD always using absolute file paths for layer references and payloads.
Fixed Euler flipping issues when importing some USD stages with complex rotation animation.
Fixed invalid skeletons being produced when importing some USD stages with prim names that are not globally unique.
Fixed various issues while importing an asset containing elements named "None"
Fixed support for UDIM textures when opening or importing USD Stages via the USD Stage Actor.
Silence a couple warnings when trying to fetch transforms from Interchange scene nodes with none authored.
Fixed missing actors and assets when importing scenes via USD Interchange that contain sibling prims whose names differ only by character casing.
Fixed a crash when resaving assets imported with Interchange after deserializing them with Interchange disabled.
Fixed HeterogeneousVolumeComponents not refreshing after their SparseVolumeTextures imported via USD Interchange were reimported.
Fixed incorrect skeletal mesh influences when importing skeletons with multiple root bones via Interchange USD.
Fixed various import issues related to using names that resolve to NAME_None.
Fixed risk of missing content when importing FBX containing assets or bones requiring name sanitization.
Fix SparseVolumeTexture assets imported via Interchange USD ending up named as "Null" if the VDB filename itself was purely numeric.
Fixed the handling of some skeletal mesh edge cases via Interchange USD, like nested LOD meshes.
Fix transforms placed directly on LOD meshes being ignored when importing into level with Interchange USD.
Scripting
New:
Exposed FullyLoadPackages/FullyLoadAssets functions to editor scripting via EditorLoadingAndSavingUtils
These fully load the given objects, so that UE no longer has a write lock on their on-disk files (eg, when needing to overwrite the file via an external application).
This is also available in the UI via Asset Actions -> Load, if you hold shift while clicking on Load.
Added support for texture-based tool icons in Scriptable tools.
Added support for setting a custom UUserWidget above the tool details panel of a Scriptable Tool.
Preview Platform Blueprint Functions:
TogglePreviewPlatform: Toggle the Preview Platform On/Off
SetPreviewPlatform: Sets the Preview Platform.
The Preview Platform is set from a list of valid Preview Platforms, the same present in the Preview Platform Menu.
Added a Disable Preview Platform Blueprint Node.
Added a GetDrawableGeometryActor() BP function to fetch the actor that owns any line, point and triangle sets added by a Scriptable tool.
Exposed FTSTicker to Python:
This exposes the superior and safer FTSTicker-based ticking method to Python, and existing Python scripts using the Slate-based ticking methods should consider migrating to use this new method (unless forwarding ticks to an embedded UI framework, which was the intent of the Slate-based ticking methods).
The new ticker callables can be registered via `unreal.register_ticker_callback(...)`, which takes a callable (taking a float delta time, and returning a bool where True means continue to tick), along with the delay (in seconds; default 0) that we should apply between each ticker callback. `unreal.unregister_ticker_callback(...)` can be used to remove a previously registered ticker callback.
Examples:
def run_once(dt): print("run_once") return False # stop ticking
unreal.register_ticker_callback(run_once, 1.0) # call run_once once after 1 second
def run_many(dt): print("run_many") return True # continue ticking
run_many_handle = unreal.register_ticker_callback(run_many, 1.0) # call run_many repeatedly after 1 second delays
unreal.unregister_ticker_callback(run_many_handle) # stop calling run_many
Exposed the ability to include or exclude editor-only references from script asset registry queries
Bug Fix:
Added an encoding fix for PipInstall to force a utf-8 encoding.
Fixed a crash in ExecutePythonScript when Python was disabled at runtime.
Fixed a crash when re-registering Scriptable tools during mode shutdown.
Fixed reachable garbage objects warnings when compiling ScriptableTools containing ScriptablePoint/Line/Triangle sets.
Fixed an issue with accept/cancel/complete actions not firing in ScriptableTools mode.
Fixed 'no world was found for object' warnings when invoking WorldContextObject functions in a Scriptable tool.
Fixed a crash when calling DataTable RemoveRow from editor scripting.
Fixed non-deterministic tool order in Scriptable Tools category palettes.
Added a fix to ensure AssetTools do not call slate functions in headless.
Fixed Python Callback attached to Dynamic Delegate
Editor can now run even if Python is not able to load properly.
UI
New:
Significantly improved the Content Browser column sort performance for large search results.
Updated the Content Browser navigation bar so clicking in the empty space edits the package path if available instead of the virtual path.
Slate drawing optimization: fixed float comparison of the alpha that could send an invisible element to the renderer, for negative or small alpha values.
In the graph editors, right clicking to summon the node context menu now includes the hovered wires connected pins, if any. This allows, for example, insertion of a 'NOT boolean' node on a bool wire in the blueprint editor
Made the "Show Selected" action for actors always visible in the context menu.
SlateIM: Add support for Tab widgets
CommonUI:
Updated CommonWidgetCarousel to be more consistent in its widget caching.
Added an option to determine whether or not to cache widgets at all
Old behavior was to cache widgets in the carousel's RebuildWidget, but widgets added at runtime via AddChild would never be cached.
Currently caching is enabled by default to match the behavior when children were added at design-time, though this could result in increased memory usage in use cases where all widgets were added dynamically.
Added a clockwise ordering option for DynamicEntryBox.
Updated the source control Submit dialog to display full file paths for non-asset files in the Path column.
Waveform editor: Add icons for fade options
Waveform:
Now calculates LUFS and Sample Peak values on audio import, on Waveform Editor open, and on Waveform Transformation changes.
Now displays LUFS and Sample Peak as meta data when hovering over a soundwave in the content browser.
The Path column in the Asset View will now display the package or object path of the row item if available instead of the virtual path.
Redesigned Platforms menu moved from the toolbar to the main menu.
Can now specify a screenshot view rect via FScreenshotRequest::RequestScreenshot:The view rect will be ignored if it is invalid (empty or not within the extent of the render target), or if bShowUI=true, since that takes the slate widget screenshot pathDefault behavior remains the same (to screenshot the whole window)
Enabled 10-bit swap chains on desktop platforms even when the feature level is ES31.
Slate: Modified GetCachedWidget:
GetCachedWidget now returns the Widget returned by RebuildWidget.
GetWrappedWidget returns the Widget return by RebuildDesignWidget if available. Otherwise, returns the widget returned by UIComponents via RebuildWidgetWithContent.
Added InitializeInEditor function to UserWidgetExtension and WidgetBlueprintGeneratedClassExtension to be able to support proper initialization in Editor for Extensions.
Added utility functions to query private states in the widget.
UMG Bindings: Added a new Conversion Function SetVectorParameter that takes a FColor and converts to FLinearColor.
Added support for package path suggestions to the Content Browser navigation bar.
Added support for navigating to C++ class package and object paths entered into the Content Browser navigation bar.
Optimized the font shaping process when using complex shaping (typically for Arabic).
Added a Python script for generating an html color palette for the FColorList class.
Updated mouse capture and high precision mode handling on Windows to save up to .5ms on redundant API calls
A UFont can now be a wrapper around FCoreStyle::GetDefaultFont(), for use with editor UI.
Added a CVar `Slate.UseSharedBreakIterator` to support shared ICU Break Iterators to reduce CPU usage. False by default.
Added new Header and ToolHeader sections to the ToolkitBuilder.
Added support for MVVM Bindings in asset diff tool.
Exposed world context pin on MVVMViewModelBase. This allows blueprints on a Viewmodel to access world subsystems (assuming they have an object they can use to resolve the world context).
Add SetLazyContentWithCallback to CommonLazyWidget to improve async usage in blueprints.
Add blueprint function, SetViewModelByClass, for setting VM by class on a widget directly to simplify usage.
Exposed a setter for CategoryToolbarVisibility in FToolkitBuilder.
Bug Fix:
Fixed a regression where Toolbar buttons with a combined options menu did not display that options menu when the toolbar button was clipped.
Fixed an issue where Spline-related UI elements were displaying XYZ axis labels and tooltips even when the editor was running in LUF coordinate mode.
Details: Updated the context menu and details panel for Splines so that axis labels, tooltips, and action names now correctly reflect LUF when active.
This includes context menu areas like SnapAllToSelected, SnapToLastSelected, and SetLockedAxis (temporarily disabled).
This also includes Details panel areas for Spline settings like Selected Spline Nodes Location, Rotation, Scale, Arrive Tangent, Leave Tangent, and Up Vector Logic was added to ensure these UI elements are now dynamically aligned with the current coordinate system.
XYZ (FLU) remains the fallback when LUF is not enabled.
UMG Sequencer: Fixed 2 issues.
When adding an event track as the first item in a widget animation, the duration of the animation would reset to 0, and notably the playback range start would be set to exclusive (range as (0,0)). This would persist after the length changed, for example to (0,500), meaning that any items placed on the 0 frame, such as events, would never evaluate.
When not encountering the above issue, items placed on the 0 frame would evaluate twice. This was due to a refactor to the way widget animation would playback.
Fixed the Asset View Type column sorting by the full class path rather than the display name that is displayed.
UMG:
Fixed named slot content not saving for named slot instances of widget blueprints that extend widget blueprints.
Fixed CDO de-sync with root widget property changes.
Added a fix to avoid crashes in cases of re-entrancy.
Various fixes for widget animations:
Fixed a crash caused by the runner being invalid for an unknown reason.
Fixed iteration of active animations that can grow during that iteration.
Fixed iteration of animated widgets that can grow during that iteration.
Fixed first and last frame evaluation of animations - Don't tick the widget on the first frame, wait until the next frame. The flag for that was lost during the animation refactor in 5.6 - Fix the evaluation time for when stopping which should indeed be the first frame of the playrange, not frame 0. This was incorrectly ported during the animation refactor.
Fixed how we consume the current animation time on play, to prevent events at frame 0 from firing twice.
Double clicking on a color key in the timeline now correctly opens the color picker.
Fixed an inconsistency in the Viewport right-click context menu, where the Transform options were always ordered according to FLU rather than the expected LUF, even with LUF coordinate system in use. Behavior is now consistent and context-aware across coordinate systems.
Can now pick struct type when class type picking is enabled, eg, from within the Data Table editor
UMG Designer:
Fix to FWidgetBlueprintEditor::SelectObject to support UObject selection. Fixes a nullptr access when a property was changed in the detail panel on an object that is not a UWidget.
Fixed a crash in Drag and Drop operation. Added more checks around calls to GetCachedWidget that can return a null object during drag/drop and move operation.
Fixed a crash in UMG Designer Replace widget context menu operation in the Hierarchy panel. This happened when using the replace function with a User Created widget selected in the Palette panel.
Optimized the widget editor's palette to reduce refresh cost in large projects.
Fixed virtual texture thumbnails sometimes showing the wrong texture.
Fixed an issue where screen-space widget components wouldn't render for players other than player 1 if splitscreen is disabled. There is now an option (ShowAllPlayerWidgetsWhenSplitscreenDisabled) to overlay the player layers, instead of culling out all player layers except for player 1.
Fixed a regression that caused the editor to crash when attempting to place a cooked Actor-based Blueprint class via drag/drop.
Fixed a memory leak when trying to trigger the display of a FCanvasBatchedElementRenderItem without a primitive to draw.
Fixed an issue where SearchableComboBox couldn't be set back to the same value after resetting to default.
Fixed an issue where SCommonButton wouldn't release when it loses focus
Fixed a rare crash in SlateRHIRenderer due to both main thread and render thread possibly writing to the same arrays simultaneously.
Fixed a situation where the Asset Dialog hotkeys either didn't function, or operated on the wrong widget.
Slate: Fix SStackBox not respecting the Orientation slate arg.
Fixed various possible crashes and bugs when importing offline fonts.
Fixed Content Browser columns appearing as sorted after you click on their headers in the column view even when they are no longer the active primary or secondary sort columns.
MetaSounds WaveAsset: Removed create new asset actions for unsupported assets.
CommonUI:
Fixed not being able to click buttons with Virtual_Accept while binding hold actions to Virtual_Accept.
Ensure UCommonInputPlatformSettings load is done at the right time to avoid a synchronous load flushing async load request. Now PostLoad will be called as expected for all UPlatformSettings.
Fix persistent action bindings not always being registered as persistent actions.
Fixed custom dialogs non-deterministically aligning their buttons.
Fixed an issue where FQuat variables always displayed with the name "Rotation" in the details panel, regardless of DisplayName metadata or the variable's actual name. This fix ensures that the intended name is respected and shown properly in the UI.
Fixed a typo in BoxElem.h
Prevented Pin Value Inspector Tooltips from using global invalidation, as it can cause broken tooltips or crashes in some scenarios.
SlateIM:
Fixed a case where child rows would not get removed when no longer drawn.
Fixed Viewport roots preventing mouse input for the whole viewport.
Fixed an issue in the ListView Widget where OnEntriesGenerated would fire for each entry instead of firing once all entries are generated
Fixed a crash in SObjectWidget OnFinishedPointerInput missing CanRouteEvents that causes nullptr access.
Fixed Message Log not displaying when failing to save packages.
PropertyPermissionList: Fixed buttons not appearing for functions marked CallInEditor details panel unless added to AllowList explicitly.
Fixed an issue where users can't type polish letters s and a (with a tail) into the text input.
Fixed an issue with Slate Screen Reader at initialization of the plugin.
Add missing validation check with enabling or disabling SWindow.
UMG Viewport: Made sure we EndPlay on the preview world during teardown.
Deprecated:
Deprecated SCustomDialog VAlignButtonBox since it didn't affect the button layout, but could result in the button rendering outside the dialog if VAlign_Center was used.
UX
New:
StylusInput: Added MacOS support.
Change the default of bUseLinkedOrthographicViewports to `False`.
Simplify the camera speed settings to just expose the camera speed. Min/max values are still exposed in settings.
Slice graph connections by alt+middle-mouse dragging in the graph editor.
Fix a bug where viewports could control the movement of a locked actor in a different viewport.
Added support for direct manipulation of editor viewport orthographic near & far planes.
Added a new Editor Viewport Depth Bar that provides visual control over those planes.
FDateTimeStructCustomization now has a tooltip. Hovering over a DateTime property's text box in the editor provides a hint at the format.
Disabled use of a Template SoundWave, can be re-enabled in Editor Preferences->Audio Editor Per Project Settings.
Switched to camera-relative vertical panning by default. Add an option for world-based vertical panning.
Waveform Editor: Instated Waveform editor as the default SoundWave editor.
Splits viewport panning logic so that the middle mouse button and the left+right mouse button gestures are distinct. Middle mouse can be camera relative (and continues to be so by default) while left+right mouse button always move up and down.
Outliner: Added visibility function versions that work on the selected actor's hierarchy and set H to default to toggle selected hierarchy.
Asset Picker Size Scaling as Editor Preference: Added the Editor Setting "Scale Asset Picker Widget Size" to allow the size of asset pickers to be scaled up or down.
Added a new "Toggle Selected Actor Visibility" command & behavior. This command takes the default "H" binding from "Hide Selected Actors". The command:
Hides selected actors if any actors in the selection are visible.
Shows selected actors if all actors in the selection are hidden.
Does not affect selection.
Show template projects from all plugins:
Problem:
New Project dialog only listed template projects from enabled plugins Users couldn't see or start from templates included in installed but disabled plugins.
Empty/invalid background image paths in template categories showed broken visuals
Solution:
Updated search to include template projects from all discovered plugins Added warning icon + tooltip for templates from disabled plugins.
Selecting a disabled plugin template shows a warning/error box that the plugin is not enabled.
Warning is non-blocking (no modal), project creation proceeds after user confirmation.
Notes:
Keeps behavior lightweight.
Surfaces risk (no additional modal asking to confirm creation) but doesn't block flow.
Bug Fix:
Ensured that the "Hide Selected At Startup" action now correctly applies to all selected actors, regardless of their current visibility state. Previously, actors that were already hidden were skipped by this action. With this change, both visible and non-visible actors will be consistently marked to start hidden on load.
Foundation
Build
New:
AssetManager, AssetRegistry: Add Property AffectsCookRule to ManageReferences.
Extended the AddExternalImportValidation of missing UClass imports to validate imports of all native types.
Added support for the 'Activate' flag in PluginReferenceDescriptors. This fixes an issue where the 'Activate' flag would be deleted from plugin descriptors when running some UAT programs.
IncrementalCook is now enabled for DLC cooks, but for DLC cooks it is still experimental and is not yet robust.
UHT: Added support for engine version comparisons as preprocessor conditions.
Prevented Clang builds for Windows from launching multiple link jobs simultaneously to avoid memory exhaustion.
Bug Fix:
DLC Packaging: Fix missing .upluginmanifest when packaging without -DLCPakPluginFile.
With the plugin manifest present the output folder from a DLC package can be copied into a packaged game as-is and will load through the default plugin discovery and loading process.
SavePackage: Fix errors in IllegalReferences diagnostic; it now more accurately finds the object and property that caused the illegal reference.
Core
New:
Added UE::CFloatingPoint concept.
Added value hashes and sizes to DDC replays
RemoteObjects:
Transactional RPCs can be rescheduled per Actor. This means the transaction can abort and try other transactions while we wait for needed dependencies to service the RPC.
TimerManager now has some limited transactional support.
Exposed GetClass that may skip migrations when used with FRemoteObjectId.
Exposed GetRemoteId() on TWeakObjectPtr
Distinguished between Loaning out an Object and Reassigning a Borrowed Object. This helps clarify some situations, particularly where you're sending an object and maintaining ownership you can just check if you're Loaning it now, because ReassignBorrowed is now a separate case (which means another server has borrowed it, but you never owned it).
Allow third-party crash handling to use `FAdditionalCrashContextStack`.
Default WindowsPlatform.bClangStandaloneDebug to true. This slightly increases pdb size when compiling with clang, but improves debugging experience.
FStateGraph and FStateGraphNode no longer timeout if -NoTimeouts is provided on the command line.
Added [[nodiscard]] to mutex functions.
Added [[nodiscard]] to TLess, TGreater and TEqualTo.
Optimized TCppStructOps vtables to only include functions that will be called. This now prevents users from making UScriptStruct or TCppStructOps a friend in order to allow your class only constructible by the CoreUObject system.
Refactored FInstancedPropertyBag's CopyMatchingValuesByID function to allow the caller to provide a matching function. Added CopyMatchingValuesByName that matches properties by name instead of ID.
Added FRecursiveWordMutex to support very early and/or very late recursive mutex usage.
Removed LLM dependencies on FCriticalSection and FRWLock.
Eliminate static log records in the absence of source location and log tracing to reduce program size.
Made mutating EnumClassFlags functions usable in constexpr contexts.
Added UE_LIFETIMEBOUND to TValueOrError.
Exclude trace state when log trace is disabled and optionally compile out source location from logging to reduce program size.
Use Yield() instead of YieldThread() when spinning in mutexes to improve performance under heavy system load.
Optimized ParkingLot::Wait when there is no timeout.
Added UE::CContiguousRange and CPointer concepts.
Added CCharType concept and applied it in TStringView.
Added Max() functions to sets and maps - and TSparseArray which is needed for sets.
Replaced TSortedSet's O(N^2) Append with an O(N) (at best) or O(N log N) (at worst) and added tests.
Added some basic TSet tests, based on the existing TMap tests.
Specialized FPlatformManualResetEvent for each platform that we target.
Added FOutputDeviceFence to support lifetime management of dynamic log records
Updated debug visualizers for TDeque, supporting visualisation of elements when the container is set up to use a different allocator such as TInlineAllocator or TFixedAllocator.
Add explicit nullptr constructor/equality operators to TWeakInterfacePtr Mark functions in TWeakInterfacePtr [[nodiscard]]
Fixed overallocation for unused null terminators in TStringBuilder.
Added TFunctionWithContext to adapt a callable into a function pointer and context
Improve accuracy of GC time limit by setting object destroy granularity to 10 (instead of 100) and provide a way for it to be tweaked per project with gc.IncrementalBeginDestroyGranularity.
Optimized ParkingLot callback code generation
Updated UE::Core::Private::StringLength to use TCString::Strlen outside of a constant-evaluated context, to speed up compile times with MSVC.
Added UE_IF_CONSTEVAL and UE_IF_NOT_CONSTEVAL.
Updated Oodle to 2.9.14.
Used InitializeCriticalSectionAndSpinCount to avoid an extra function call during construction of FWindowsRecursiveMutex.
Added CConvertibleTo concept mirroring std::convertible_to.
Added a configurable intrusive unfair non-recursive mutex.
Added TInstancedStruct::NetSerialize function.
Removed contention on root flags when pinning weakobjectptrs.
Improved the logging backlog to minimize the number of missed log lines during the initialization.
Added TLogTemplate and control over log template allocation.
Added IsLocked and IsLockedShared to the mutex types.
Add Async.ParallelFor.DisableOversubscription which if enabled will only use existing threads which can be faster when cores are saturated.
Added support for nested $format in structured log formatting.
Added Intel OneAPI and Microsoft Clang 19 HWPGO integration.
Added an ExecFileOverride resource to BootstrapPackagedGame.
Optimized FLazyName to support constant initialization.
Deflate, gzip & lz4hc compressors now honor COMPRESS_BiasSpeed and COMPRESS_BiasSize
Added TExternalStringBuilder and support for TStringBuilder<0>
Improvements to GameFeaturesSubsystem and FPluginDescriptor:
Added a new hook to PluginDescriptor to allow customized loading of uplugin json data.
Updated GFS to ensure that, at least in the editor, we will try to use the PluginManager's copy of the plugin data rather than re-reading it and deserializing it from json ourselves. This is necessary to take advantage of the customized loading.
Enabled custom crash handling for GPU crashes.
Optimization for FSoftObjectPath::ResolveObjectInternal to avoid the round trip to/from string.
Add a console command, core.ResetEnsureState, to reset the ensure state so they fire again. This will cause all non-always ensures to trigger again if they've already been suppressed.
Reduced memory use by FOutputDeviceFile by 992 KiB in the default configuration.
Added better error messages when TLess, TGreater and TEqualTo when used with a type without the corresponding operator.
Now validate LinkerSave unmapped objects against the package harvester excluded object list. This removes the limitation of asserting when FindObject is called while GIsSavingPackage is set.
FPaths:CreateStandardFilename: changed behavior to normalize paths that cannot be standardized: .. is collapsed when possible.
Added UE::CNotCVRefTo concept.
Removed dependencies on ParkingLot from Windows stack walking
Made the MSVC implementations of FPlatformMath::CountLeadingZeros and FPlatformMath::CountTrailingZeros constexpr.
Added format string validation to LowLevelFatalError.
Added UE::CStringViewable and UE::CCompatibleStringViewable concepts.
ThinLTO is now enabled by default for Clang based toolchains.
Added an experimental plugin, Global Configuration Data, that can be used as a single point of access to data that may be provided from different systems.
Can be used to have console and config data added to blueprints without additional code.
Additional data routers can be registers to expand on what data sources are available to the system.
Added UE::CArithmetic concept.
Added UE::CCompatibleCharType concept and some usage in TStringView.
Added UEOps.h to aid in the correct generation of all binary comparison operators based on a couple of simple member function definitions.
Replaced the UTF8CHAR enum with C++20's char8_t.
Added checks for non-trivially-relocatable types being used in containers, particularly FGCObject-derived types.
Added UE_REWRITE, a replacement for FORCEINLINE intended to be used on macro-like functions (rather than for optimization) by 'rewriting' a function call as a different expression.
Enabled override max printed reference chains via `gc.MaxReferenceChainsToPrint` Cvar.
FVector2D deprecated comparison operators (from 5.2 onwards) removed.
Remove deprecated FLinearColor methods, deprecate unused DXT block structs.
Enabled TSharedPtr and TUniquePtr to be usable as keys in sorted containers, and TUniquePtr to be usable as keys in hashed containers.
Added std::initializer_list support to TSparseArray.
Fixed UPS cooking indeterminism for TBox[2] structs on stack Make ForceInit constructor zero out padding.
Fixed managed storage handle attempting to resolve an unmanaged file more than once after the manager becomes active.
Added UE::CDerivedFrom concept.
Added debug visualizers for UE::Math::TVector2<> and FDeprecateSlateVector2D.
Extended `gc.PerformGCWhileAsyncLoading` to provide the option to garbage collect while async loading, only when low memory is detected (based on gc.LowMemory.MemoryThresholdMB).
Package flags are now thread-safe.
Add TargetRules.bIdenticalCodeFolding setting (--icf=all).
Added intrusive unset optional support to TNotNull.
Added a benchmark for mutex types.
Added CSameAs and CDecaysTo concepts.
Added UE::CIntegral concept.
Added tests for Algo::StableRemoveIf.
Added configs managing how GenericPlatformMallocCrash handles allocation requests on non-crashing threads, allowing them to permanently suspend on allocs/frees, suspend on allocs and skip frees, or process as normal.
Removed dependency on FCriticalSection and ParkingLot in memory allocators.
Retry in the shared mutex TryLockShared while there is not an exclusive lock.
Added support for joining non-contiguous ranges in TStringBuilder.
Added support for optional sub-object references in localized structured log formatting.
Reduced codegen impact of ensure() macro.
Added an overload of CreateLogTemplate that takes the format as FText.
Added support for $locformat in structured log formatting.
Added NotNullGet for retrieving the inner value from a TNotNull without an explicit cast.
Experimental Visual Studio 2026 support.
Added a new experimental API: SpringMath:
This includes some useful functions for critically based spring damping
Added experimental blueprint library for spring math to expose functions to BP
Added SpringMath::ExponentialSmoothingApproxQuat to mirror the existing function FMath::ExponentialSmoothingApprox.
Added support for creating Property Bag Placeholder types for entity prefabs.
This is done via a new table added to package files: ImportTypeHierarchy table.
Each entry of that table contains hierarchical information for every FObjectImport entry that is a type (e.g., UClass).
This is the second part of a 2 part change. The first change introduced the package file header change along with the object version bump.
This change adds the remaining logic to save/load the new table and the change to use it when creating placeholders.
Added support for AVX10.
Added write helpers to RapidJsonUtilsAdded UE::Json::WriteCompact and UE::Json::WritePretty, to write a UE::Json::FDocument to a FString in either compact or pretty form.
Added UE::Json::MakeStringRef and UE::Json::MakeStringValue to help convert a FStringView to a UE::Json::FStringRef or UE::Json::FValue when building a JSON DOM.
Added some additional aliases to UE::Json that are needed when building a JSON DOM.
Switched UE::Json aliases to use the UE FMemory allocator, rather than rapidjson::CrtAllocator.
Added --prioritize-dependency-scanning SN-DBS build option.
Added `FNonshrinkingAllocator`, which changes the shrinking policy to No by default.
Added hidden MetaData works for base structs in Instanced Structs.
Cooker:
CookPackageSplitter: Changed the return value of GetGenerateList to a struct (and changed the name to ReportGenerationManifest) so that generators can request that the package containing the generator be not saved.
Deprecated the ability to run the cook inside the editor process when launched from editor. The cook instead should always be executed in a separate invocation of the CookCommandlet. This has been the default since 5.3, and we are now deprecating the ability to change that default and will remove all support for it in 5.9.
Added the following commandline arguments:
-cookshowremaining
-cookshowpackagenames
-cookshowinstigators
These provide a clearer behavior than -dpcvars=cook.displaymode=1|2|4.
Each flag can be specified with a value: -cookshowremaining=1|0, or with no value, defaulting to 1: -cookshowremaining.
These flags override whatever value has been assigned via config or -dpcvars commandline.
Introduced a mechanism for render asset updates to be abandoned by owning `UStreamableRenderAssets` so `UStreamableRenderAssets` can be garbage collected independently (See r.Streaming.EnableAssetUpdateAbandons). Abandoned render assets are ticked during GC or every streaming update if r.Streaming.TickAbandonedRenderAssetUpdatesOnStreamingUpdate is true (defaults to true).
Bug Fix:
Changed FMonotonicTimeSpan::IsInfinity() to stop matching negative infinity.
Fixed FMath::FindDeltaAngleDegrees and FMath::FindDeltaAngleRadians for input deltas outside [-540, 540] degrees.
COMPILE_WARNING reports as error when WarningsAsErrors is being used.
Fixed a potential infinite loop in the serialization of packed ints when loading malformed values.
Fix potential deadlock in the scheduler if a foreground task is scheduling a background one.
Fix potential deadlock in object annotations because of 2 different locks used in different order.
Made -VerifyGC and -NoVerifyGc take all verification cvars into account.
Fixed invalid access to memory location error in UnrealBuildTool.
Made sure that pinned UObject are preventing GC of clusters they are part of.
Fixed composite EPackageFlags not being shown in the debugger, caused by non-power-of-two enumerators.
Fixed _GetUObjectPacked intrinsic for debug visualizers. This addresses an issue with visualizers for weak object ptrs not working in builds where UE_ENABLE_FUOBJECT_ITEM_PACKING == 1.
Made TBox's InverseTransformBy and TransformProjectBy both check for box validity before transforming (matching TransformBy).
Fixed issues trying to load redirected native classes using the StreamableManager (and AssetManager).
Fixed a bug in GC timing where if it destroyed exactly 100 objects in a frame it could cause a large stall.
Fixed many log categories having a default verbosity higher than their compile-time verbosity.
Fixing a crash in CppStructOps caused by unloading a dll at an inopportune time resulting in a dangling pointer to a vtable.
Fixed TMemoryWriter IndexSize to be a bit count.
LaunchEngineLoop: Fixed a copy paste mistake in the error message, it now correctly identifies that it fails to load the Game Engine class instead of the Editor Engine class when instantiating GEngine.
InstancedStruct: Fixed the operator= when copying from a TConstStructView.
The loader will now flush any remaining async loads before PreExit to avoid async loading to perform operations past the exit point.
Fixed UE_STATIC_ASSERT_COMPLETE_TYPE for zero-sized arrays.
Enabled seeking to the end of a response body without returning CURL_SEEKFUNC_FAIL in the Curl implementation in DevHttp module.
Fixed UI layout for a particular view of the crash report dialog where the screenshot preview can cover button controls.
Fixed clang miss-leading indentation warnings.
Checked zlib init and shutdown for errors.
Cleaned up usages that expect nullptr_t to be in the global namespace.
Fixed StaticDuplicateObject when Source Object class and Destination class are different.
Fixed crash when loading content from corrupted pak or optional segment files.
Disabled nuget audit for the dotnet Development configuration to prevent unactionable dotnet build errors.
Force synchronous writes on type library input files.
Fixed pipe and task timeout calculations that generated bad code.
Deferred invoking the class initializer on duplicated objects until after subobject instancing has occurred.
Disable 'C4702: unreachable code' when use bUseInlining is disabled.
Fixed potential race condition in FConfigCacheIni::ForPlatform adding plugins without holding the lock.
Fixed text import of delegate properties with full object paths, and made FDelegateProperty consistent with FPropertyMulticastDelegate on text export.
Added static_asserts to TValueOrError to ensure that it's not instantiated with references.
Fixed a FARFilter with only WithPackageFlags or WithoutPackageFlags set failing to return any assets from IAssetRegistry::GetAssets(...).
Avoid TInstancedStruct::GetPtr/GetMutablePtr and TStructView/TConstStructView::GetPtr crashing when the underlying struct data is incompatible with BaseStructT
This will now ensure instead, though will still perform the bad cast in a shipping build, so any ensures need to be fixed!
Fixed TStringView::CopyString for copying an empty range.
Fix a missing test of MaybeWaitingFlag in FManualResetEvent before parking the thread.
Fixed Algo::RemoveIf calling the predicate too many times in some cases, and added some tests.
Rehashed map and set properties after instancing key subobjects in their overrides of FProperty::InstanceSubobjects.
Disabled AutoSDK for LowLevelTests targets.
Fix thread scheduler to properly apply the cvars TaskGraph.UseDynamicPrioritization, TaskGraph.UseDynamicThreadCreation, and TaskGraph.OversubscriptionRatio which can be used to modify thread performance.
Adding -nocrashreports support for windows. When provided, we will log crashes/ensures/etc but will not perform more complex reporting that could risk hanging on a file pipe.
Reimplemented TVectorRegisterType with partial specializations rather than std::conditional_t to work around alignment issue using Clang on Windows.
Disabled custom property lists during native struct serialization.
Fixed a race waking threads in FSharedMutex and FSharedRecursiveMutex.
Added workaround for getting an array reference element from an rvalue tuple under MSVC.
Deprecated:
Deprecated Alignment in TStaticArray and fixed UB behavior in it's GetData. Made TArrayView and Invoke constexpr.
Deprecated TSortedMap::GetMaxIndex, fixed TSortedSet::GetMaxIndex and correctly commented TSet::GetMaxIndex and TMap::GetMaxIndex.
Deprecated public and protected ways of initializing TStringBuilderBase from a buffer.
Deprecated member TFunction::CheckCallable which was never intended to be public.
Deprecated TIsConst.
Deprecated PLATFORM_COMPILER_SUPPORTS_CONSTEXPR_BUILTIN_FILE_AND_LINE.
Replaced bExactClass with EFindObjectFlags in the FindObject family of functions.
Deprecated the original log template API.
Delete FCbFieldIterator::MakeOwned() to avoid breaking the iterator.
Dev Tools
New:
Added compile warning argument ordering.
Wildcard support in project sections of UGS ini files.
Improved the summary outputs of UnrealPak. The units of memory now scale with the number of bytes making it easier to read for both smaller and larger containers.
UBT DefaultBuildSettings:
Build Settings V6 now applied to wundef.
Default Build Settings Updates for Targets - V6 - engine.
BuildCMakeLib: Added support for building third-party projects with CMake using the Ninja build system.
Adding capabilities to the warning defaults, cleaning up tests, adding more warning+error strings for easier long term adoption & toggling.
UHT will flag U macros (i.e. UCLASS) found in skipped blocks of code as deprecated. This will be made a warning in a future version of UE.
UBT Editor: Added graceful messaging for Target upgrade requirements on editor path.
Emit the target build settings version & build environment to target file for editor runtime consumption.
Consume target file metadata to improve error messaging for Target versions.
Bug Fix:
Fixing a bug where UAT could hang waiting for output. We now log a warning instead.
Shaders: Fixed the shader pipeline skipping work if the number of shaders to compile is less than the number of tasks available.
Fixed an issue where if a TInstancedStruct is used as a function argument, Clang platforms would fail to compile.
Fixed BuildCookRun to include base build .sig files when generating patches.
Updating UHT to once again generate an error when a USTRUCT contains more than one base.
Fixed an issue in UnrealVS that could cause UnrealVS.P4->History to open an empty window
Updated UnrealVS - Includes fixes to test discovery and execution
Corrected define usage (UE_BUILD_SHIPPING vs UE_SHIPPING)
Fixed UHT parser issue where if FArchive is forward declared when used in the Serialize function declaration, UHT would fail to generate the proper code.
Fixed inconsistent exception logging in Gauntlet.TestExecutor. It now consistently uses Exception.ToString().
Fixed issue in UHT where it was allowing a USTRUCT to have multiple USTRUCTs as base classes.
Fixed a bug where presets would be added to the global sync filters if the tab with the preset had its sync filter view opened and the okay button pressed.
Fixed UGS not showing investigations as "resolved" when using Horde's metadata endpoint.
Fixed destination files potentially not having the correct permission during SafeCopyFile in UAT, on non-Windows platforms.
Horde
New:
BuildHealth Server Build: Added JobSummary telemetry.
Hashed issue handler will now automatically check for a file property in the event's structured logging, and use that data in suspect finding. This should lead to suspect changes being identified more accurately, but relies on emitted warnings and errors including file metadata.
Analytics:
Added a Build Health Dashboard View that shows step outcome history for selected templates & streams.
Add ExternalIssueKey & Fingerprint to the telemetry payload for issues. Also includes AnalyticsIntegrationTests.
Added example of implementing a new Secrets Provider for Azure Key Vault. This secret provider is experimental and provided as an example of how to implement a custom secret provider.
Added Secrets plugin configuration option WithAws that controls if the AwsParameterStore provider is enabled.
Added new Secrets API api/v1/secrets/resolve/ that resolves a string to a property value of a secret. For example the string horde:secret:SecretName.PropertyName would resolve to the value of PropertyName for the secret SecretName.
Only commits with Code CommitTag are considered when searching for Compile issue suspects.
Removed the unused Password property from EpicGames.Horde.Streams.IWorkspaceType.
Added the attribute ResolveSecret that allows properties in the Global Config to be resolved to the value of a Horde secret during configuration load.
If the property's value is of the form horde:secret:SecretName.PropertyName then if a secret SecretName exists and has a property PropertyName it will be replaced with the value from the Horde secret.
This allows sensitive configuration properties to move out of the configuration files to an external secrets provider such as AWS or HashiCorp Vault.
New: Updated the Password and Ticket properties for the Build Config's PerforceCredentials property to use the attribute ResolveSecret allowing Perforce credentials to be moved to an external secret provider.
Changed build graph updates where a node that is skipped but modified does not fail the whole build. This allows the build to continue with only dependent nodes being marked as skipped while non-dependent subtrees can continue to run.
Replaced the deprecated code coverage tool JetBrains.dotCover.GlobalTool with JetBrains.dotCover.CommandLineTools.
Added to the Stream Config a StreamTags property, which is a set of name and Boolean pairs; and to the Schedule Config a Condition property.
The Condition property can be used instead of the Enabled property to control if the scheduled jobs for a stream should be enabled.
Each stream tag will have an environment variable named after it with the UE_HORDE_STREAMTAG_ prefix and a value of True or False, which can be used in BuildGraph script conditions.
Fixed an issue where capabilities for agents was missing their RAM capacity.
Updated Temp Storage to allow the maximum number of exports to write in a single request to be configurable from the agent settings. The new option is TempStorageMaxBatchSize and defaults to a value of 20. Modified from contrib .
Bug Fix:
API encounters ".NET type System.Text.Json.JsonElement cannot be mapped to a BsonValue" on swagger API invocations.
Fixed an issue where GetNext for ScheduledDowntime would return the previous downtime.
Fixed an issue where the log for the Downtime Service would print the next downtime being in the past when an expired non-repeating downtime was in the global config.
Server Tests: Fix the DatabaseIntegrationTest class to properly forward dispose calls to the mongoDBRunner.
BuildHealth Server: Exposed DateUtc on GetCommitResponse.
Fixed an issue where capabilities for macOS agents was missing information for:
CPU number of logical cores.
CPU performance and efficiency cores for Apple Silicon.
GPU name and core count.
User name, domain name and running as administrator.
Fixed an issue where the Notices Get method would not return the start and finish times, and if the start and finish times are set then set the active value accordingly.
Insights
New:
Adds pre and post state change callbacks for TraceLog channels. Allows instrumentations to deny state changes and provide a reason for the denial, as well as performing actions when a channel is enabled or disabled, such as sending initial state, resetting tracked state or activating tracking.
Added a method of creating a TraceAnalysis session using a custom data stream.
Added an ability to copy a tooltip value to clipboard from the bookmarks track.
The PlatformEvents channel now uses callbacks to deny enabling channels and provide user feedback, if requirements are not fulfilled.
Added support to save data traced via the Direct Trace mode to disk. FDirectSocketStream can now accept an optional FArchiveFileWriterGeneric used to write the data to disk.
Added support for Frame Start and End Misc Trace events in the minimal trace API.
Added config variables to provide variable trace log write buffer size and prevent writer sleeping. This helps prevent the write thread from getting saturated under heavy load.
Increased version of Unreal Insights to v1.08, for the UE 5.7 Release.
Improved management of TraceLog worker thread in various scenarios. The worker thread can now be started on demand.
Bug Fix:
Fixed a startup deadlock when launching with -trace=memory without tracehost or tracefile.
Fixed an issue where FTraceAuxiliary::Relay did not respect the Options parameter provided.
Fixed an issue due to Trace gap detection using three sync points. Previous logic used two sync points to calculate gaps, but the engine sends out three. In some scenarios this caused an error in gap detection which meant a higher serial was chosen as the next serial. This would leave much of the trace data unprocessed.
Framework
AI
Bug Fix:
Fixed an issue where selecting subnodes would result in the currently-edited property value to be discarded instead of applied.
AI Behavior Trees
Bug Fix:
Fixed reinstantiation for Blueprint-based nodes using blackboard key selector.
Fixed Blueprint reinstantiation issues with some BehaviorTree types.
AAIController::UseBlackboard: Fixed to correctly return the result of trying to initialize the Blackboard.
Changed InstanceIdx to use a const int32 to prevent a need for IntCastChecked to prevent possible data truncation.
AI Debugging
New:
Added possibility in Rewind Debugger tracks to override the default behavior to step backward and step forward commands.
VisualLogger log entry initialization can now also assign a valid location for components. With this change, double-clicking on such an entry will bring the camera to that location instead of the world's origin.
Fixed GameplayDebugger local-multiplayer render duplication.
Bug Fix:
Fixed ever growing buffer in FVisualLoggerBinaryFileDevice when VisualLogger is not set to record to file.
Fixed debug draw helper functions and SmartObject visualization to properly handle scaled DPI.
AI EQS
New:
EnvQueryTest_GameplayTags: Added searching for tags container in actor's components if actor itself doesn't implement IGameplayTagAssetInterface.
Upgraded the description details of the UEnvQueryTest_Pathfinding test to better reflect its behavior in EEnvTestPurpose::Score mode.
Bug Fix:
Fixed blueprint reinstantiation for EQS types
AI Navigation
New:
NavLink Generation:
Added a name property to generation configs, and JumpMaxDepth can now be negative.
Activated the "enable" property now that multiple configurations are supported.
Added multiple link configurations for generated navlinks.
Added LinkGenerationSelectedConfig to debug a specific config.
Improved trajectory ground sample debug display.
GameplayDebuggerCategory_Mass: Now draws a purple circle around entities that are LOD off.
AsyncNavWalkingMode can use navmesh normal instead of physics hit normal.
Now always take the highest hit location in z when searching for ground location.
Mass Navigation:
Added text to MassNavigation::Debug methods.
Added an option to avoid slowing down when steering.
Added a MassSceneComponentVelocityTranslator to copy velocity between mass entities and actors.
Updated NPC desired movement based on current velocity when in animate mode for root motion driven NPCs. This helps with smooth blending into animated states from steering when character is root motion driven.
Added navmesh path boundaries to mass gameplay debugger.
Added logs in the navigation flow.
Mass Entity: Fixed an infinite loop caused by loop variable overflow ().
NavMesh: Added a navmesh tile building optimization when using CompositeNavModifiers with lots of data.
Mass Navmesh Navigation: Increase default corridor width used by FMassNavMeshPathFollowTask.
Pathfind: Changed warnings to logs when InitPathfinding can't find a polygon at the start or the end location.
Removed deprecated 5.4 navigation code.
MassNavMeshPathFollowProcessor: Improved logging information and clamping distance on the closest segment.
MassNavMeshPathFollowTask: Removed overlapping points when building a corridor.
Mass Navigation and Avoidance:
Made a fix to apply max speed in UMassApplyForceProcessor.
Added debug to display standing entities in mass avoidance.
Pathfollow -> Made a fix to keep the steering force when near the end of a path (we want to apply the fade only on the avoidance forces).
Used stronger avoidance forces when getting out of environment boundaries.Added an optional tag to prevent moving backward while avoiding.
Navigation: Added in the output log information regarding invalid pathfind requests and changed log verbosity from error to warning.
NavigationSystem: Replaced legacy repository unregisternavrelevantobject method with UnregisterNavRelevantObjectInternal.
Bug Fix:
Navigation:
Fixed a crash occurring when building navmesh on PIE ending.
Made a tentative fix for a crash occurring when navigation is being rebuilt because a navigation override is being removed when clearing world components.
Update SplineNavModifierComponent to apply the NavAreaToReplace to its modifier.
Guarded against zero DeltaTime in UPathFollowingComponent::FollowPathSegment to prevent division by zero ().
NavLink Generation:
Fixed missing links on small navmesh patches.
Made a fix to avoid filtering overlapping links if they used different navigation areas.
Fixed automatically generated navlinks being created without the NavLinkFlag.
NavMesh:
Made a tentative fix for a rare crash in storeWallSegment.
Fixed assertions occurring in UE::NavMesh::Private::CalculateMaxTilesCount().
Fix FindDistanceToWall returning incorrect result and finding a closest position that is not on a wall.
Fixed editor crash when a large number is typed in the Agent Radius value.
ISMC: Fixed an ensure in UInstancedStaticMeshComponent::GetNavigationBounds() caused by invalid navigation bounds. CachedBounds were being invalidated and not being recomputed when instances were added individually.
ZoneGraph: Fixed problem with converting FZoneGraphTag::None to FZoneGraphTagMask ().
Fix for AsyncNavWalkingMode using stale normals.
AI Smart Objects
New:
Added method to retrieve a Smart Object slot's UserData from the SlotView.
Added basic MRU slots implementation for MassSmartObject with settings in Mass SmartObject section of the project settings:
MRUSlotsMaxCount: Possible values between 0 and 4 (default: 0, meaning that the feature is not used; up to 4 slots).
bUseCooldownForMRUSlots: to allow the most recently used slots to be considered again a given period of time.
MRUSlotsCooldown: period of time during which a given slot will not be considered after being used.
Added all camera controls to the SmartObjectEditor toolbar
Bug Fix:
Fixed a crash in AITask MoveTo
Fixed an issue where the NavNodeRef was not included when requesting the slot entrance location with the option for projecting to navmesh enabled.
AI State Tree
New:
Added a rule to remove sustained state. All reselected states are new states.
Added Blueprint helper 'RunStateTreeRunStateTree' to execute a StateTree on an actor. Helper will use an existing StateTree component or add it if necessary.
Added Multiply operator to the Consideration score calculation.
Added ExecutionExtension callback when a transition is about to be applied.
Bug Fix:
Fixed a Runtime Validation false positive error when changing state trees without running any.
Fixed a transition that didn't remove the frame when a sub-frame changes root.
Prevented a reentrant call into StartTree and Tick for StateTreeComponent and GameplayInteractionsContext.
Fixed temporary frames not cleaned up when we run multiple transitions and did State selection more than once.
State tree references can now change while the tree is not run.
Fixed editor freezing when the user spams undo/redo operation inside State Tree Editor.
State Tree Editor: Hide level actor picker in the state tree editor.
Fixed property function node value not being retained in new nodes when copied/pasted/duplicated.
Fixed property bindings not being retained in new nodes if the old bindings were removed before pasting.
Fixed details view not always syncing correctly with the selected editor node.
Fixed Delegate Listener being unable to bind to the nested Delegate Dispatcher.
API
New:
Added DrawDebugCircleArc version accepting a quaternion for orienting the arc with an arbitrary roll.
Bug Fix:
SlateIM ComboBox now properly shows its selected value when spawned.
Audio
New:
Waveform Editor:
Added a noise threshold for zero crossing logic.
Added an inverted S fade function.
Streamlined the trimming workflow to have new UI handles and be enabled on opening the waveform editor.
Added loop, delete, and conversion options when right clicking.
Playback hotkey adjustments to allow move playhead to start
Added an icon to fade handles.
Made adjustments to default nudge settings.
Added controls to scroll left and right when zoomed using the right mouse button.
Made memory improvements for MetaSounds in the Operator Cache.
Added a Fade Node in MetaSound Experimental.
Added Blueprint equality operator for MetaSound literals
SoundWave Cue Point Origin now has improved defaults. Default origin is now the Waveform Editor Transformation Markers, unless the .wav had cue points on import.
Added a new Virtualization Mode: Seek Restart. This mode will virtualize, but keep track of playback time and, when realized, seek to that time as if it was playing the whole time. It's a less accurate, but more performant alternative to Play When Silent.
Performance improvements when using and destroying a large number of Quartz subscribers.
Metasound Trigger Filter node display name is now Trigger Chance to better convey its meaning. Some of its advanced pins are now hidden by default, and the node & pins tooltips have been made clearer.
Added "MaintainAudioSync" input to Wave Player Node as an advanced input to the Wave Player MetaSound Node.
"MaintainAudioSync" will compensate for latency during playback of streaming wave assets so that the playback of the audio stays in sync within the playing MetaSound.
Added a new debug display for Audio Modulation: au.Debug.Modulation.ActiveMixes
This will display all currently active mixes.you can choose whether Global Control Bus Mixes are included with au.Debug.Modulation.ActiveMixes.ShowGlobalMixes
Both experimental and legacy subtitle fields are now initialized for DialogueWaves so users can switch between them.
Added Subharmonizer MetaSound Node to standard library.
Added an option to only support Vorbis decoding, not encoding, for memory-constrained targets.
Renamed the "Create Subtitle" Asset Utility action to the more-specific "Make Asset UserData from Legacy Subtitles."
Improved extendable MetaSound node configuration editor details customization.
Added two new features to Control Bus Mixes:
Control Bus Mix Timer: Set a duration on the Control Bus Mix, and it will disable itself that many seconds after activating.
Retrigger on Activate: Optional behavior where, when a mix is activated when it's already active, it sets the values on the CBM to its default values and starts the attack over again (like retriggering an envelope).
Added a new Asset Action Utility that enables converting Overlay assets into subtitles in bulk.
MetaSound presets now inherit default metadata (ex. float range/clamp) from parent graph if applicable.
Subtitles and Closed Captions plugin:
Multiple Subtitles can now be added to a single SoundWave. All of them fit inside a single Asset UserData.
No longer queues subtitles if the engine settings for subtitles are turned off.
Added an Enum to Subtitle Assets to distinguish when the duration property is relevant vs when it stops automatically using a sound's length.
Subtitles from now have a default priority of 1.
Subtitles created in a SoundWave's Asset UserData will automatically estimate the length of the sound and default their duration thereto.
Sequences now support dragging and dropping subtitles.
Changed the USubtitleTextBlock class name to USubtitleWidget.
Added automatic subtitle playback support for DialogueWaves inside SoundCues.
Added a Blueprint node for queuing all the subtitles in an Asset UserData at once.
Added a Blueprint function for hot-swapping the Widget.
Added StopSubtitlesInAsset BP function.
Bug Fix:
Waveform Editor:
Fixed an issue where selecting a loop region marks the soundwave dirty.
Fixed an issue where highlighting and saving with a loop region selected disables the rest of the soundwave playing.
Fixed SoundWave markers with incorrect position data on export to USoundWave.
Scrubber Undo Fixes
Fixed frame length resetting to default instead of min when sliding loop region size.
Fixed exported soundwaves not supporting undo transactions.
Fixed ensure on undoing loop deletion.
Fixed editor crashing when closing out a Sound Wave asset after canceling to Export Waveform.
Fixed undo markers triggering ensure
Made UI fixes for markers with positive frame length
Made fixes to popup clearing.
Fixed right click getting stuck when scrolling waveform.
Subtitles in the Subtitles and Closed Captions plugin with delayed starts now respect internal/external timing choices.
Subtitles from the Sequencer plugin now correctly update their visibility when scrubbing along PIE.
Fixed crash with MetaSound user preset widget tab.
Fixed shutdown crash on Audio Streaming Cache handle ref counting.
Fixed a bug where, when a submix is deactivated, Modulators attached to it would still be active.
Fixed a bug where submixes with modulators could not disable via the Auto-Disable setting.
Fixed an issue with the Seek Restart Virtualization mode where it did not properly account for changes in pitch before virtualization.
When the sound virtualizes, it will use the last pitch it was set to to estimate where it should seek upon realization.
Sound Attenuation: Fixed == operator on FSoundAttenuationSettings.
Fixed MetaSound relative render cost being incorrectly reported in some cases when using the operator cache.
Fixed a bug where some Modulation inheritance settings were not working in some cases for non-volume modulation on sound sources.
Fixed MetaSound comment node positions not saving properly after resizing.
Fixed a bug where projects with the Audio Modulation plugin disabled had logspam.
Fixed crashes when using MetaSound node configuration with pages.
Fixed a MetaSounds edge case when the on-done trigger is triggered mid-buffer.
Fixed a MetaSound crash when clicking audition menu after closing asset editor
Fixed a bug where the Chorus Source effect modulation settings did not respond to Modulation changes.
Fixed Sine Curves on FVolumeFader when used outside [0,1] range. They should now follow the expected curve between any two values.
Fixed a bug causing various ITD features to have an enormous delay.
Blueprint
New:
By default the Blueprint editor no longer searches for references to variables when the variables type is changed via the blueprint editor
To re-enable this behavior, set "bSearchForReferencesWhenVariableTypeChanged" to true in your editor settings.
Can now call BlueprintFunctionLibrary functions from classes that do not implement GetWorld or ShowWorldContextPin. It now always shows the pins if needed and will always connect invisible pins even if they are marked as optional.
Added a SetFocusInViewport node to UScriptableInteractiveTool. This means scriptable tools can give focus to the viewport so that key bindings pass through without user interaction.
The Blueprint Debug Draw Line / Point / etc. methods now have the option to draw with 'screen' depth priority.
Added ToRotationVector, MakeFromRotationVector and GetShortestArcWith to the Kismet Math Library.
Structs tagged as HasNativeMake can now still have their individual members set.
Asset/Actor Actions in Developer folders show for everyone.
GetBlutilityClasses already had code to ensure that we don't list other devs' blutilities.
However, it didn't use the correct path format, which caused FPaths::IsUnderDirectory to always return false.
Similarly, UEditorUtilitySubsystem::HandleStartupAssets never had a similar filter to begin with.
Bug Fix:
Fixed failure to copy instanced Blueprint component value overrides on copy/paste workflows.
CollectionsManagerScriptingSubsystem:
Removed a warning from GetAssetsInCollection when an asset could not be found.
Fixed an issue where logs displayed as red despite actually being warnings.
Fixed an editor crash after clicking on a deleted graph node hyperlink in the Blueprint editor's compiler results tab.
UK2Node_VariableGet::SetPurity erroneously removed the SetPurity function from the public API of UK2Node_VariableGet. This fix now re-adds SetPurity, but changes its implementation to use TogglePurity.
Fixed an editor crash after clicking on a deleted graph node hyperlink in the Blueprint editor's compiler results tab.
Fixed a crash when editing children from a cooked Blueprint that had editor-only components.
User defined structs with Text fields with non-trivial default values no longer alter themselves on load.
The Blueprint diff tool now reports changes to Create Event Node's signature function.
Fixed potential for ICH override template namespace collision after reparenting an Actor-based Blueprint.
The engine no longer crashes when it exits while a search in Blueprints is ongoing.
Added more crash report context to paths where we are failing to resolve a node's owning Blueprint and/or graph, while using an ensure to avoid crashing the editor as a result.
Blueprint Compiler
Bug Fix:
Fixed crash in SerializeUnversionedProperties during cooking.
Fixed crash when cooking blueprints with local object references set to objects in asset.
Fixed compiler failing to find newly added functions on Blueprint interfaces, which led to implemented functions being renamed.
Fixed one cause of 'Reachable Garbage' when recompiling Blueprints.
Blueprint's delegate signature checking logic no longer accidently looks at local variables when matching function signatures.
Fixed one cause of loss of Blueprint subobjects when a Blueprint that is contained in another Blueprint is compiled.
Fixed a crash in garbage collection due to mislinked SKEL_ classes, most frequently seen during long-running cook operations.
Blueprint Runtime
Bug Fix:
Fixed a bug where arrays of structs with custom identical operators could fail to copy from Blueprint generated classes correctly.
Fixed push-model blueprint array property not properly marked dirty if modified by different actor.
The root cause of the issue is due to incorrect function signatures on array function thunks. Several of them mark their input array as 'const', but clearly change the array.
When push-model support was added, this problem was discovered and worked around by adding MARK_PROPERTY_DIRTY calls directly in the thunks. The problem with this solution is that it doesn't work when we change an array on a different actor.
Additionally, the thunk doesn't have enough information to determine that easily.
The correct solution is to leverage the existing code in FKCHandler_CallFunction that has sufficient context to inject MarkPropertyDirtyNode accurately.
In order to get array functions working, we needed to fix their signatures to use UPARAM(ref) instead of 'const'. One issue with this fix is that there might be existing Blueprint code that incorrectly uses mutable array functions with read-only data.
For now, we'll support this, but with a warning to fix the code as it'll become an error in 5.9. Currently, this warning is disabled until we fix affected content.
Fixed a memory leak when using containers with types that allocate memory by default.
Gameplay
New:
Mover:
Added a method of canceling movement features by matching gameplay tags.
Added User-Defined Struct support for Mover data collections, so Blueprint-only users can include custom data without requiring native code.
Now supports spring-based walking mode work in networked play.
Reduced potential memory operations when adding to a data collection by preferring to copy onto an existing matching struct if possible.
Added options for supporting root motion for non-vertical moves, which makes possible combining them with gravity-based falling.
Added a double buffer for cached sync state to avoid issues with reading in data that may be freed/overwritten.
Added Mover-Mass translators along with a Mover Integrations plugin to house various integrations between Mover and other systems.
NavWalking mode now sets floor results in the Mover Blackboard when projecting to level geometry is enabled.
Added an auto-expire policy option for rollback blackboard entries.
Added support for blueprintable layered moves through a new system that splits up Layered Move Logic and Data.
This allows Layered Move Logic to be made natively and in Blueprints in an effort to expand blueprint support in Mover.
These new layered moves exist alongside the old ones at the moment with the intention of these new moves eventually replacing the old ones.
Added options for handling out-of-band movement changes, whether to warn about it and whether to accept it as the new starting sim state. Usage is primarily for non-networked play, where an external system is allowed to move the actor around, such as during cinematics or temporary physics simulation.
Converted absolute timesteps to double-precision.
Now supports avoiding state-copying operations when the simulation state doesn't change.
Added AdditiveVelocity MixMode support to MultiJump Layered Move.
Made small adjustments to the extended Mover pawn to make sure additive velocity is respected by turning off extra jump input from CharacterMoverComponent Jump.
Added option for flat-bottom floor checks.
Added consistent angular velocity when changing movement modes.
Adjusted mover API to use a FVector for angular velocity instead of a FRotator. This changes some public API related to Mover.
Removed the gravity orientation from angular velocity calculation.
Added simple montage replication support for the character-focused MoverComponent.
Added first version of rollback-aware blackboard.
Added experimental option to append inputs into sync state, for cases where you want to share inputs with sim proxies that are not simulated and may not have those inputs available.
Made MoveInput and MoveInputType BlueprintReadOnly, so setting this input is done through specific functions only. This means we can properly apply some precision to input to make sure all clients/server have same value after NetSerialization.
Cameras:
Added Blueprint getter nodes for camera rig parameters.
Added evaluation context to transition conditions' API.
Now shows the name of the camera rig on the rig prefab node.
Added more debug information for blend stacks.
Added ResolveCameraRigProxy method to Blueprint camera director.
Moved lens calibration camera node to the CameraCalibrationCore plugin
Some changes to input slots:
Now runs input nodes in OnRun. OnUpdateParameters is only meant for pre-blending input parameters, not running actual logic, if only because it is run in isolation on just a few nodes that opt-in.
Moved the revert axis options onto the base input slot class.
Added a speed option on the input slot class. Pre-blend that instead of pre-blending the actual player input.
Moved the user-exposed option for accumulation onto the axis-binding specific node, in preparation of adding an actual accumulation node for more complex input chains.
Moved axis-binding code to a helper class in preparation of a "raw" input action node.
Added raw input action and accumulator node for complex input chains.
Added "driven control rotation" input node:
This input node makes possible using a "centralized" player input system which drives control rotation on the pawn, while still enabling cameras to have different orientations, such as when using target preservation with various lateral offsets (and therefore parallax requiring converging cameras with different orientations).
The active camera rig uses control rotation as-is, but any blending-out camera rigs use their last control rotation driven by the "delta" control rotation each frame.
This seems to be a good compromise between cameras limited by a single orientation and having player input managed by camera rigs individually.
Added the GetPlayerController method on the Blueprint camera node evaluator.
Added an option on camera components to set control rotation.
Added the ability for the Camera Debugger panel to bind to specific camera system instances (for instance, picking which Gameplay Camera actor to debug).
When drag-and-dropping a camera or camera rig asset onto a level or a sequence, create the corresponding actor.
Camera rig parameters now default to not pre-blended.
Defaulting to pre-blended benefited a few cases, but also caused visual bugs in a couple of other cases, so it's not worth turning it on by default.
Moved persistent rig activation functions onto the camera components and the camera manager.
These Blueprint functions were previously global, affecting whatever camera system host was currently considered "active".
This turns out to be unclear and prone to errors. Now the user activates persistent rigs exactly on whatever they intend to.
Now auto-create camera rigs and assets when nothing is specified on a Gameplay Camera component (but log a warning).
Made the orientation initialization service available to 3rd parties, and added an API for overriding the target or yaw/pitch to preserve.
Added a Blueprint utility function to access the evaluated camera's orientation.
Added Teardown API for node evaluators, added layer and active camera rig information.
Made node evaluator and evaluation service flags inclusive by default (i.e. opt-out).
Added a new "initialize with ideal framing" option on screen-space framing nodes.
Added a "family shortcut" bar to various camera asset editors for helping navigate between related assets.
Users can now set variables to be pre-blended.
Made QoL improvements to the Blueprint camera node.
Added bone/socket options to the attach to player pawn node.
Improved advanced camera shakes (add shake instance IDs and the ability to interrupt and stop a shake), improved the internal API for implementing shake nodes, and fixed a few bugs.
Implemented a more proper auto-build for camera assets for PIE.
GAS:
Improved logging for missing attributes in FActiveGameplayEffectHandle when using GetGameplayEffectMagnitude.
Gameplay Tag display ends in an ellipsis when the display is cut off rather than overflowing.
Gameplay Tag and Tag Container meta data "DisplayShortTagNames" will now remove the Categories filter from the beginning of the Tag chip in the details panel.
Gameplay Effects stacking options now have better names and comments.
CooldownGameplayEffectClass validation: When a GameplayAbility is configured with a cooldown GE class, validation will check whether that GE applies any tags.
Updated the GameplayTagCountContainer to serialize tags itself and provide for fine control of what tags should replicate where via EGameplayTagReplicationState enum.
Exposing common GameplayEffectSpecHandle and ActiveGameplayEffectHandle queries to Blueprint. The following Blueprint callable functions have been added to AbilitySystemBlueprintLibrary to empower Blueprint programmers when making GameplayAbilities. Since some GameplayAbilityTask callbacks only provide a GE spec handle and/or active GE handle, now you can do more with those handles:
GetGrantedTags: Gets gameplay tags granted by a Gameplay Effect, from the effect's spec handle.
GetAssetTags: Gets gameplay tags describing the GameplayEffect, from the effect's spec handle.
GetGameplayEffectFromSpecHandleIsDurationGameplayEffectSpecHandle: Whether a GameplayEffect is instant or non-instant.
IsActiveGameplayEffectHandleValid: Whether a handle for an active GameplayEffect is a valid handle or not. Applied instant GEs don't result in an active handle.
IsActiveGameplayEffectHandleActive: Whether a handle for an active GameplayEffect is a valid handle and it's still applied.
GetAbilitySystemComponentFromActiveGameplayEffectHandle: Retrieving the AbilitySystemComponent from an active GE handle.
Renaming a gameplay tag in the Gameplay Tag Manager now automatically renames all sub tags.
Added predictive gameplay effect stacking and improved stack overflow handling.
The data validation error for when there is a null input trigger on a key mapping now includes the name of the input action which it is mapped to.
You can now call "SetShouldConsume" on any Enhanced Input bound action handles.
You can also define "ENHANCED_INPUT_ALLOW_LEGACY_BINDING" in your game's .build.cs file to enable legacy key bindings onto enhanced input components, making upgrading to enhanced input easier.
Added GetActorFilter UPROPERTY meta support to object picker (mirroring GetAssetFilter).
Added a virtual function to UBlueprint, ShouldAutomaticallyRegisterInputOnConstruction, which can be overridden in widget blueprints.
Added a set of deprecated input action/axis names in the project settings.
Added "Setter=SetShowMouseCursor" to APlayerController::bShowMouseCursor.
Added ReleaseGameFeaturePlugins for multiple plugins at once. Unloading plugins batches GC and GameplayTags tree changes together which improves performance of unloading operation
Added an editor preference for setting a "Simulated Device Mapping Policy".
This can be used in the editor to change how input devices get mapped to platform users, which can be useful for testing device connection sequences for your UI, log in flows, etc.
Added the current device mapping policy to the output of the "Input.LogAllConnectedDevices" command.
Added helper functions to Ability system library: HasAnyAbilitiesWithCondition and HasAnyAbilitiesWithAssetTag
Added QueueWorkFunction and SendQueuedWork to the TaskSyncManager which can be used to queue a batch of function pointers to execute as a simple tick task. This can be used with RegisterTickGroupWorkHandle to safely schedule batched gameplay thread work from any worker thread.
Calling GetDeviceSpecificData now uses the given input device ID. If that is invalid, it uses the platform user's most recent device.
Added LoadGameIfExistsAsync to SaveGameSystem which combines the exists and load checks into one async call to avoid an extra frame delay. Changed GameplayStatics to use this for async loads which fixes a warning when trying to load a nonexistent save game.
Added ensure and comments to prevent creation of registered FTickableGameObjects on worker threads which is an unsafe race condition.
Added an option to the FTickableGameObject constructor to enable creating with a disabled tick, which is safe on a worker thread.
Added bindable "virtual" accept and back FKeys.
Added a OnPostUserSettingsInitialized delegate to Enhanced Input, which will fire after the Enhanced Input User Settings have been initialized on the subsystem.
Added more ways to detect a local player subsystem when using the node which does not have an explicit player controller target pin.
Implemented SlideAlongNavMesh option for CMC NavWalking mode. This means pawns in NavWalking mode can move along a navmesh rather than just moving towards a projected point on the navmesh.
CineCamera: Added an option to disable dynamic exposure.
Previously, turning off depth-of-field with FocusMethod would also turn off exposure simulation. This was fixed recently, but also meant that CineCameraComponent would now always simulate exposure, which isn't always desirable.
This change adds a new ExposureMethod setting to allow disabling exposure too.
Made sure that the key mappings "supported key profile" tag is respected, and made the OnKeyProfileChanged delegate Blueprint assignable.
Fixed a race condition crash on shutdown of the SteamController plugin.
Added an "Input.LogAllConnectedDevices" command to dump all the currently connected input devices and some metadata about them to the logs.
Reduced mouse input overhead on Windows by processing raw mouse moves on a separate FRunnable thread in the WindowsApplication..
GameplayTags and GameplayTagContainers created in Blueprint give the user a way to edit the "Categories" metadata for tag filtering in the owning Blueprint.
Fixed a crash where UPlayerInput::SmoothMouse would assert before it would attempt to divide by zero.
Bug Fix:
Mover:
Fixed a bug in mover angular velocity clamping where the limit was not respected when rotating off axis
Added CommonLegacyMovementSettings shared settings in various movement modes to avoid a crash that could happen if they were the only mode added.
Fixed an issue where pawns wouldn't follow a navlink off the navmesh if bSlideAlongNavMeshEdge was true.
Nav walking modes now force a navmesh projection if something comes along and invalidates our last floor information, such as teleportation.
Now initialize the Mover mode state machine earlier so it can be used in backend initialization if desired
Fixed NaN issue in UMovementUtils::ComputeVelocity that could happen when MoveDirectionIntent was zeroed out.
Fixed issue where backends could leave stale non-persistent structs in sync state between frames.
Fixed several cases where strict equality checks on orientations could fail due to float point imprecision.
Fixed an issue where a specified InputProducer could fail to have ProduceInput called on it.
Fixed a Blueprint editor crash during validation if there's a shared settings object set to None.
Fixed issues with trying to maintain the small distance off of floors in falling/flying modes where a character could get pulled towards the floor.
Fixed improperly calculated angular velocity for mutli-axis rotation cases, and added utility function to compute it.
Fixed a bug in standalone mode where the time step was being rounded down to the nearest whole millisecond.
Fixed floating point precision error in mover's fixed delta time calculation.
Finding a movement modifier by handle and by type now searches through the queued modifiers on the Mover State Machine as well. Fixes an issue where modifiers weren't found immediately after queuing them.
Fixed local->world root motion conversions when non-yaw rotations are involved.
Fixed cases where some movement modes were not respecting the setting for remaining vertical.
Fixed bugs where an actor can violate the min/max distance it's supposed to float above walkable floors.
Made sure we use BaseVisualComponentTransform to update PrimaryVisualComponent transform in FinalizeFrame so changes to BaseVisualComponentTransform apply to the visual component regardless of whether we're smoothing state or not.
Now properly expose Movement Mode in-out references in GenerateMove and SimulationTick to Blueprint.
Searching modifiers by handle with an invalid handle will return nullptr rather than active modifiers with invalid handles that haven't been fixed up yet.
Now passing along starting velocity in Falling modes if we didn't use any time. This fixes some velocity cancellation that sometimes causes a stutter on landing.
Cameras:
Fixed main camera assets not being usable as Blueprint variables.
Fixed crashes and bugs with rewind debugger integration.
Improve debug info display with extra data, more filtering options, and a few other things.
Fixed single-rig updates missing some of the steps the blend stack does.
Fixed static initialization problems that can lead to debug blocks not saving their fields in trace files.
No longer freezes camera rigs during stateless evaluations.
No longer warns about a camera asset not using any rigs if it's using proxies, and builds any rigs in the proxy table.
Fixed a crash when a camera's enter or exit transitions have empty pins.
Fixed an incorrect reset-to-default behavior on the camera parameter editor UI.
Now prevents infinite recursion when there's a cyclic reference of camera rigs.
Fixed gameplay tag transition condition; when a tag query is specified, it should fail if there is no previous/next camera rig.
Normalized yaw/pitch for spline orbit node
Can now run the target ray-cast node when there's no player controller.
Can now build and run camera rigs and shakes with no root node.
Now prevent rig prefab nodes referencing their own camera rig.
No longer throws asserts or error messages when we have a camera actor without an asset specified on it
Fixed activating persistent rigs during director initialization, and having these rigs receive custom parameter overrides.
Now validates that exposed camera rig parameters have the correct type for what they're connected to.
Fixed possible crash in GPC camera manager when the last evaluation context is removed from the stack.
No longer updates dampers and interpolators when the delta-time is zero.
Now properly freeze blends (possibly mid-blending) when freezing a camera rig in a blend stack.
Fixed simple fixed-time blends not saving/restoring their current time.
Fixed a crash when changing the type of a camera rig parameter.
No longer shows byte/int types for data parameters.
Now resolves camera rig name conflicts when building the property bag for a camera asset.
Fixed camera rig parameter nodes not being added to the list of graph objects.
Fixed assert when adding an enum data parameter to a camera rig.
Fixed broken "inline" evaluation of camera shake prefabs.
No longer pre-blends camera variable table entries that are not flagged for it.
Fixed the tick group for the camera components.
Fixed a crash when running editor builds without an editor.
Added missing initialization call for blend nodes in merged camera rigs.
The camera reference widget is now disabled if overridden with a rig parameter.
Fixed a crash when connecting a camera variable reference to a camera rig parameter.
Fixed an issue where rigs could keep running with old data after their asset was rebuilt.
Fixed "Home" button in camera rig editor.
Deleted references to camera variables when a variable collection is deleted.
Fixed a possible crash when running with unbuilt or outdated rigs.
Fixed Blueprint breakpoints not working on GET/SET parameter nodes.
Fixed shake prefab node not passing shake parameter values over to the visual layer in deferred mode.
Fixed SET parameters nodes not setting anything if the parameter wasn't already known in the variable/data tables.
Fixed error messages for unexpected situations lerping/overriding variable tables.
Fixed variable and context data tables sometimes returning uninitialized memory, and replace assert with one-time warning.
No longer uses manual focus distance on the output camera component if the focus distance isn't set.
Fixed pin types and colors for some data parameters.
Fixed incorrect parameter/pin types on the Blueprint camera node for object and class pointers.
Camera modifier rigs added from the player camera manager should now be aware of the player controller.
Added fixes for the player camera manager:
No longer double-updates Gameplay Camera actors
Now run the vanilla (Blueprint-based) camera modifiers ourselves after the camera system.
Now sets the transform of the camera manager itself to where the final viewpoint is.
GAS:
Consolidated code that checks whether an AttributeSet's FProperty represents a gameplay attribute, and improved coverage and stability:
FGameplayAttribute details customization dropdown will only show attribute set properties that represent GameplayAttributes. Previously it showed all properties.
GameplayDebugger will now also display doubles. Doubles as FGameplayAttributes remain supported for legacy reasons.
Fixed GameplayDebugger crash when an UAttributeSet had any int32 UPROPERTY().UAttributeSet::InitFromMetaDataTable now only processes property types that can back gameplay attributes.
Fixed a crash when debugging gameplay effects with aggregate by source stacks.
Fixed an issue where SetTagMapCount didn't call OnTagUpdated like the other tag update functions. This will now be called when Gameplay Cue tags and Loose Tags are added and removed (No change for changing values that don't add or remove the tag).
Fixed target data recalculating source tags and attributes when applying Effect Spec.
GameInstance pointer for Async Actions is correctly reset after it is un-registered.
Network Prediction: Changed static initialization of FNetworkPredictionModelDefRegistry's singleton to avoid issues with static initialization happening out of order causing registered Network Prediction model definitions to be skipped/removed. Also, made some minor adjustments to FNetworkPredictionModelDefRegistry::FinalizeTypes to avoid potential ODR issues.
Fixed an error in ULocalPlayerSaveGame::IsSaveInProgress where it always returned true even if one was not in progress.
Added an ensure to protect against missing player state crashes during seamless travel.
Map placed actor Event Dispatcher duplicates:
A map placed Blueprint actor's bindings to another map placed actor's multicast delegates (including Event Dispatchers) are now cleaned up when the actor is destroyed and reinstanced.
This fixes a bug that bindings to other actors' multicast delegates accumulate when recompiling an actor blueprint. Previously this resulted in event nodes firing multiple times, increasingly when the Blueprint is recompiled.
Now return the playercontroller if found from the owner.
Network Prediction: fixed crash in smoothing service that could occur after adding more simulation objects during runtime
Fixed replication issue canceling Gameplay Abilities when destroying the ASC from the server while abilities are active.
Fixed Multiply (Compound) modifiers not calculating correctly with stacked GameplayEffects.
Prevented a crash in APlayerCameraManager when the owning player controller has been GC'ed.
Input triggers and modifiers will now properly respect the priority of an input mapping context. This fixes a bug where if you had the same input modifier class on an input mapping context of a different priority, it would always use the modifier values of the one which was pushed to the stack first.
Fixed code that removes ?listen from client URLs to work correctly with # options as well.
Ensured that the "SlateApp.GetModifierKeys" function will return the correct values when called on platforms using GameInput to process keyboards.
Fixed OnBlendComplete not being broadcast in Standalone (non-networked) games.
Find-in-Blueprints: When a BP member variable is a struct, its members' default values are now searched and returned as results. Map keys are not supported yet.
Chaos Mover: Fixed floating point precision error in ChaosMoverStateMachines's fixed delta time calculation.
No longer restarts a camera animation blend out when reaching the blend out time if we were already stopping.
Fixed DefaultToInstanced subobjects breaking on blueprint duplication.
Fixed instanced subobjects, including DefaultToInstanced classes and UPROPERTY(Instanced), breaking when a blueprint class with instanced subobjects got duplicated.
This fixes the following editor actions which previously resulted in data loss:
Duplicating blueprints with user defined instanced subobjects.
Duplicating blueprints with GAS attribute set DefaultSubobjects.
Player Input: Fixed a bug where if you had an input component whose outer was a subobject of the currently controlled pawn, the input component would be processed twice.
One example where this could be a common issue is within the "Modular Gameplay Framework". Users would add a UInputComponent to some UActorComponent, and then call "PushInputComponent" on the owning player controller. This would result in the UInputComponent being processed twice.
This would happen because in "APlayerController::BuildInputStack" it calls "GetComponents" on the controlled pawn, which would return the UInputComponent which had already been pushed to the controller's input stack, thus adding it twice to the stack for processing.
Enhanced Input: Do not load platform-specific override data on post load of the platform settings. If you are referencing an object that is in a plugin, this will just fail anyway and does not improve any sort of loading behavior.
Fixed an incorrect Deleter being used on FGameplayAbilityTargetData when calling FilterTargetData, and exposed FGameplayAbilityTargetDataDeleter for this purpose.
Use this deleter when creating an FGameplayAbilityTargetData using FMalloc, such as in UAbilitySystemBlueprintLibrary::FilterTargetData.
When creating TSharedPtr to FGameplayAbilityTargetData which was created with FMemory::Malloc, please use the FGameplayAbilityTargetDataDeleter
Deprecated:
Deprecated the "Speech Mappings". These speech mappings were originally added to support Hololens, which is no longer a supported platform and can be removed.
Removed the deprecated functions on the camera manager, GetCameraCachePOV and GetLastFrameCameraCachePOV.
GAS: Deprecated StackType to make it private in the future, use new accessors instead.
Mass
New:
Added time-slicing with FMassEntityQuery::FExecutionLimiter to limit execution to a set entity count.
Added a Mass command for grouping entities.
Mass Debugger:
Added "Open In Query Editor" button to all query displays in the debugger.
Added handle-based sorting of entities on the Entities tab.
Completely overhauled breakpoints with new types, filtering, hit counters, session to session persistence, copy-paste.
Added query editor UI with load/save and copy/paste support for authored queries.
Added Fragments view tab.
Added new "Selected Entity" breakpoint filter to break for whichever entity is selected in the gameplay debugger or debug UI.
FMassFragmentRequirements and FMassEntityQuery are no longer UStructs, which they were never supposed to be.
Added observers locking to commands flushing. This change results in batching observers calls, significantly reducing the number of individual observers executions (~20 times in CitySample).
Added MassQueryExecutor to unify the functions of MassQuery and MassProcessor and create a foundation to remove dependency on UObjects for Mass processing in the future.
Simplified Mass data access with templated UE::Mass:FAccessors collection.
Added a way to fetch base-typed fragment views from Execution context while providing the actual, specific class with a UScriptStruct pointer.
CFragment concept now checks whether types are std::is_trivially_copyable and if not emits errors requiring users to manually mark fragment types that are not trivially copyable.
The goal is to educate fragment creators about good practices and point out fragments that might accidentally violate the requirement.
Deprecated FMassBatchedCommand::Execute as a const function and introduced non-const replacement named `Run`.
Unfortunately a new name had to be introduced since the constness of the function is the only thing that's changing.
Added a temporary construct to MassCommandBuffer to statically detect commands that still implement the deprecated virtual Execute in an attempt to make it easier for people updating their code to notice the change.
The construct will check at compile time all the pushed commands of known types and statically assert if the command type still overrides the deprecated `Execute` function.
Entity Builder API extension, supporting use of an arbitrary "element" type and having the builder figure out what kind of an element that is and store it appropriately. Additional changes:
Fixed FEntityBuilder::AddInternal implementation to not add duplicated instances of a given element type if one is already present.
Added creation context to the deferred path, to ensure the fragment values are already set when the observers kick in. This was already done in the synchronous path, so this change addresses the inconsistency
Added a couple of functions to MassEntityManager, that deal with types passed in as UScriptStruct, and pass the argument to the appropriate function, based on the type (Tag or Fragment).
Mass Command Buffer API extension:
PushUniqueCommand: the function lets callers add a hand-crafted command. Use it to push commands that you don't want to get merged with other commands of the same type.
AddTag and RemoveTag: added versions that take an array view of entity handles.
DestroyEntities: Added a version with rvalue ref parameter.
Added FMassFragmentRequirements::AddElementRequirement that can be called at runtime with UScriptStruct.
It will add the provided type to Fragment or Tag bitsets, depending on the type represented.
Added FMassRepresentationParameters::Identical to implement logically-correct FMassRepresentationParameters instances comparison. The operation by design ignores CachedDefaultRepresentationType and CachedRepresentationActorManagement.
Added a way to ask a MassCommandBuffer about its host thread.
UMassVisualizationTrait can now be configured to not check mesh descriptions for validity which can be used to procedurally populate trait instances.
Bug Fix:
Fixed inconsistencies between single and multi-threaded deferred command flushing in FMassProcessingPhase::ExecuteTick.
Modified the occasionally failing ensure condition in UInstancedActorsData::OnInstancedActorDestroyed and provided it with more comments and a message to emit.
Properly handle shared fragment hash collisions.
Mass puppet actors now get destroyed immediately when the puppet is destroyed.
Fixed configuration issues of FMassProcessingContext created in UMassSpawnerSubsystem::DoSpawning for running initializer processors.
The original configuration was flushing commands if any have been issued, but did so in a way that forced flushing of all the system's commands accumulated up until that point. That resulted in different behavior in entity spawning depending on whether there were initializers for a given entity available or not.
The new configuration results in keeping the behavior consistent, regardless of initializers presence, which is to not flush commands and if any are issued they will be appended to the main buffer when FMassProcessingContext goes out of scope.
MassGameplay:
Fixed a crash when a mass representation actor is destroyed while mass simulation is active.
Fixed a teardown crash in MassAgentComponent.
Fixed a situational crash in UMassRepresentationSubsystem on world teardown.
MassAgentComponent changes to update EntityHandle-to-actor mapping in MassActorSubsystem when dealing with a player-owned component.
The change fixes an issue with GameplayDebugger's Mass category not being able to display info on the player-owned entity. A tiny change to the category removes the friction when doing that (no longer requiring the transform fragment to display data).
Fixed an issue in FMassEntityQuery::ParallelForEachEntityChunk stemming from the code not taking into consideration that ParallelForEach's workers can be moved between threads.
If that happened and the query was run with `bAllowParallelCommands == true`, then the command buffer would complain about being used outside of the thread of its creation. The fix is updating the thread ID of the command buffer whenever it's picked up.
Now sorting observer processors to utilize UMassProcessor.ExecutionPriority.
Fixed FarmTest to not crash on PIE:
The existing implementation is crashing since the changes to processor initialization have not been applied there.
This issue is limited to the farm-test, due to the custom and legacy way of setting up and running processors.
Fixed standalone-game IA uses by properly talking to ServerInstancedActorsSpawnerSubsystem, which fixes some IA representation issues.
Also, ServerInstancedActorsSpawnerSubsystem has been fixed to `FinishSpawning` actors only once their IAComponent has been configured.
Marked UMassCapsuleTransformToMassTranslator as "game-thread only" to avoid data races when the observed component is modified in game thread as the data is being accessed by the processor.
Networking
New:
Implemented RPC state stomp detection which can detect state buffer writes between quantization and serialization. The cvar to control this is net.Iris.RPC.ServerStompDetectionEnabled which is false by default.
Support Iris when using NMT_JoinNoPawn and NMT_JoinNoPawnSplit.
Adding an FSocket::ReleaseNativeSocket for use with native socket API's (e.g. asio). Using this new function inside the TraceAnalysis' FDirectSocketStream to support cases where we want multiple connections, not just a single connection (e.g. a multi-server capture).
Iris
Implemented seamless travel support. If seamless travel support is not needed for a project the cvar net.Iris.AlwaysCreateLevelFilteringGroupsForPersistentLevels can be set to false to avoid unnecessary overhead of filtering objects in the persistent level.
Optimized polling to only poll objects/properties that are marked dirty.
Added some async loading failure debugging cvars:
net.Iris.AsyncLoading.FailPackageName Name: fails async loading all packages containing the package name.
net.Iris.AsyncLoading.FailNextLoad 1: fails the next async load regardless of the name and resets the cvar.
net.Iris.AsyncLoading.FailAllLoads 1: fails all loads until the cvar is set to 0.
Gracefully handle reaching the end of the bitstream even if it's unexpected. The behavior is controlled via cvar net.Iris.ReplicationReader.GracefullyHandleReachingEndOfBitstream.
Added better logging when handling end of bitstream issues. Reset the read journal when deserializing huge objects.
Added a NetDriver command for printing out all of the actors registered for replication (generic replication system only).
NetEmulation:
Added netEmulation setting to simulate buffer bloat on game traffic.
Set PktBufferBloatInMS for outgoing packets and PktIncomingBufferBloatInMS for incoming packets.
Ex: 'netEmulatation.PktBufferBloatInMS 1000' will apply 1sec of buffer bloat on outgoing traffic.
netEmulation.BufferBloatCooldownTimeInMS can also be used to set a cooldown period between each buffer bloat occurence.
Ex: 'netEmulation.BufferBloatCooldownTimeInMS 2000' means buffer bloat is not applied for 2secs after a buffer flush.
Added a "BufferBloat" emulation profile that enables buffer bloat of 400ms (in and out) over an 'average' emulation profile.
Added metrics to measure the performance and behavior of the multiserver proxy.
Multithreaded Iris Polling Step:
FObjectPoller can now kick off multiple FReplicationPollTasks, each of which processes a subset of the ObjectsConsideredForPolling array.
This is set to process cache line sized Chunks in an interleaved pattern so that each task gets a roughly balanced amount of work, and we avoid false sharing the same cache line.
Also supports the ForcePoll flow if PushModel is disabled.
Added NetBitArray ForAllSetBitsInRange function to facilitate iterating over different parts of the same Array inside each task.
FNetTypeStats now supports threaded access through the use of ChildNetStatsContexts that are used during parallel phases and then accumulated into the parent context at the end of a frame.
Configuration is done at the ReplicationSystem level so that we can enable it just for GameNetDriver on the Server.
We define a flag called bIsInParallelPhase which is true whilst the FReplicationPollTasks are running, and is used to protect against non-thread-safe access during this time.
Added capability for Networking Iris Polling phase to be run in parallel. This can be enabled by adding bAllowParallelTasks=true to the ReplicationSystemConfig
MultiServer:
Refactored LaunchMultiServer script. Users can now derive from it to add their own features.
The -ProxyGameServers command-line argument can now accept a port range. This helps with launching multiple servers on a single host, so you can just use 127.0.0.1:9001-9025 for 25 servers.
RemoteObjects: Now reschedules aborted ServerReplicateActor calls rather than retrying them.
Fixed an issue where UActorChannel::ReplicateActor did not account written bits in one of the paths
Renamed RepNotifies CSV stat to Generic_RepNotifies to better distinguish between Actor Channel based replication (generic) and Iris replication.
Added support for closing child connections in the net driver and closing connections on the multiserver proxy.
Added mutators to UNetworkMetricsDatabase functionality.
Mutators can be added to UNetworkMetricsBaseListener and get a chance to process input metrics every frame. They report an output metric to their owning listener on the listener's reporting interval.
Use mutators to aggregate metrics that are set more frequently than a listener's reporting interval. Basic mutators for min, max, and average are provided.
Added server-side network metrics for RawPing values across all client connections.
Added support for actor replication relevancy when using the multiserver proxy.
The multiserver proxy now shares a single NetGUID cache and objects are cached on the proxy when migrating between servers.
Bug Fix:
Fixed a crash which could occur if an actor channel was removed during replay playback scrubbing.
Iris:
Fixed bug with FastArraySerialzierFragment if using not replicating items.
Fixed bug where FGameplayAbilityTargetingLocationInfoNetSerializer would not properly call FreeDynamicState.
Fixed bug that could prevent a default subobject from receiving a large RPC.
Fix edge case with prioritization causing a crash.
Fixed issue where dirty status of new subobjects created from PreUpdate of objects was masked out.
Now resets NetBitStreamReader between batches to get correct read journal entries and clear overflow status.
ObjectProperty class type is now validated property when serializing object references.
Fixed a bug where initial state was not applied when beginplay() was dispatched for world from AGameStateBase::OnRep_ReplicatedHasBegunPlay.
Fixed a bug that allowed adding subobjects to torn off root objects.
FScriptInterfaceNetSerializer can now handle blueprint implemented interfaces.
The ObjectReplicationBridge's AddDependentObject method will now prevent circular dependencies.
Fixed bitstream corruption that could lead to disconnects.
Can now pass zero size to FNetBitStreamWriter's InitBytes method.
Network:
Added UE_FAST_ARRAY_COMPILE_LOG_LEVEL that enables a program to control the compile time verbosity of LogNetFastTArray logs.
Since this class is templated the logs in the functions are unique per implemented class so it can grow the amount of the log static strings if they are left compiled-in.
Fixed issue with FObjectReplicator's CanSkipUpdate with net.PushModelSkipUndirtiedReplication enabled.
Made a change in UNetDriver::IsLevelInitializedForActor to avoid iterating over net connections if the actor we are evaluating has the correct world, or if the actor it is not a player controller
NetDriver:
Fixed ping updates discarding higher ping values when multiple Acks were received in one packet.
For example this caused ping values to stay low during BufferFloat occurrences.
Added RawPing metric that tracks the highest ping value received every frame.
RawPing will not change if no packets are received or the incoming packets contain no new Acks.
When using Iris replication, objects that have a spatial filter set at runtime will now always use their correct location for filtering calculations.
When using Iris replication, actors and subclasses without explicit FilterConfig overrides in ObjectReplicationBridgeConfig will now be filtered based on their relevancy flags like bAlwaysRelevant.
Previously these actors were treated as always relevant regardless of their bAlwaysRelevant flag.
Deprecated:
Removed error prone SetConnectionFilter API from UReplicationSystem. Use exclusion groups instead.
Deleted UNopNetObjectFilter. It's been superseded by UAlwaysRelevantNetObjectFilter which has identical functionality.
Deprecated GetSubobjectsWithStableNamesForNetworking function
Level Design and Art Tools
Geometry Core
New:
We now use the fast cluster simplifier for convex decomposition's pre-pass simplifier (since the main use case is to make the decomposition faster).
Geometry Core: Added morph target attribute as a core dynamic mesh vertex attribute.
Added path intersection & difference.
Added a ReparameterizedCloserToWorldFrame to the GeometryCore TOrientedBox3 class.
Added a CreatePerVertex method to dynamic mesh overlays, as a faster alternative to the CreateFromPredicate() method in the per-vertex case.
Added a vertex -> single triangle method to dynamic mesh, as a faster/more-convenient path (vs e.g. using a vertex->triangles iterator to get a single element).
FDynamicMesh3 queries now optionally take an inline-allocated array for local vertex-neighborhood mesh queries.
Added optional scale factor to DynamicMeshUVEditor::ScaleUVAreaTo3DArea utility function.
Added option for geometrycore's MeshBoolean to report the source mesh of each result triangle.
Added option for the Mesh Boolean to take a custom 'inside mesh' function, per mesh.
[GeometryCore] Delaunay 2D iterative update support.
Added a version of Expand() to FAxisAlignedBox3 and FAxisAlignedBox2 that takes a vector.
Segment Tree: - add option to build the tree with an array of segments - make use of the filter function that's passed in as an option.
Bug Fix:
We now reset the UsedCount on a moved-from RefCountVector, so it is left in a valid state (and e.g. a mesh will not fail CheckValidity after being moved from).
Made the implicit morphology generator not hit an ensure() when passed an empty mesh (and still return an empty result).
Fixed the dynamic mesh color transfer method handling of non-compact meshes when biasing element positions, and simplified the lerp-toward-centroid logic used.
Fixed static mesh's LOD -> dynamic mesh conversion handling of non-compact polygon group IDs
We need to compact these IDs so that they correspond to static mesh section indices, which all our tools and geometry script processing expect.
Improved performance of MeshRegionGraph operations:
Region merging transfers known neighbor information, rather than recomputing it.
Less redundant validation on internal operations.
Less redundant array searching when building neighbors.
Added api exports to the OBJMeshUtil methods so they can be called from other modules.
Made MeshConvexHull's grid sampler exit when mesh bounds are empty, to avoid ensures on grid w/ zero cell size.
Fixed dynamic mesh CompactInPlace creating a triple-sized TriangleEdges array + add coverage for this case in CheckValidity, and guard against this kind of error breaking AppendWithOffsets.
We now do not leave unused vertices in the cluster simplifier mesh result mesh.
Fixed incorrect transforms on GeometryCollectionToDynamicMesh converter, and added more comments to document the expected coordinate spaces for these meshes.
Fixed crash in implicit morphology offset operation due to offset grid dimensions overflowing int32.
Fixed a possible crash in algorithms that use the sparse solver wrapper, by properly handling failed factorizations.
Geometry Script
New:
Added various oriented box functions to geometry script, to create and query / test intersections and convert to meshes.
Added an OBB containment function to geometry script (matching what simple collision fitting does, but exposing the found oriented box directly).
Improved geometry script's CopyCollisionMeshesFromObject support for complex collision.
It now supports any type that implements the IInterface_CollisionDataProvider interface, and specifically should now work better with Skeletal Mesh Components and Spline Mesh Components.
Added a 'select occluded from outside view' jacketing method to geometry script, to have more controllable occlusion operations (e.g. from specific directions, for specific material IDs/parts of mesh, w/ transparent tris).
Also, cleaned up the detect exterior visibility function logic to support the new options and be a bit faster / more robust.
Added target edge length QEM and cluster-based simplification methods in geometry script.
We now more consistently use the term "Connected Islands" instead of "Components" when referring to connected pieces of a mesh in Geometry Script nodes.
Filled out geometry script list conversion extract/set methods for the various list types: Scalar, UV, Vector and Color.
FOrientedBox is now exposed to Blueprint.
The 'debug' pins in geometry script are now hidden in the Blueprint graph
Geometry script now supports standard MikkT tangents in the Compute Tangents node, on platforms where the MikkT library has been compiled (i.e., win/mac/linux).
Bug Fix:
Added Vertex and Triangle ID validation to geometry script Mesh Query methods so users do not crash on querying an invalid element ID.
Made dynamic mesh pools safer to use from a non-game thread.
Fixed the output param display name for GetMaxMaterialID.
In geometry script asset creation methods, we now test that the paths for new assets are valid before attempting to use them.
Fixed a bug with "AppendXWithSimpleCollision" geometry script methods where repeated calls of a script could accumulate extra copies of the collision shape, because blueprint re-uses output reference objects across script invocations.
Removed requirement that patch unwrap mesh be non-compact.
Fixed issue where Geometry Script would maximally simplify a mesh if "Simplify to Tolerance" was run with a tolerance of 0.
Deprecated incorrect geometry script perlin noise node, and added a corrected v2.
Landscape
New:
No longer visualizes disabled landscape patches.
Now sorts landscapes alphabetically when multiple landscape actors are editable in landscape mode.
Changed the landscape Collapse Layer tool to use selective render weightmaps code instead of intermediate render code.
Added weightmap support for edit layer selective renders.
Added a GrassMap RenderEveryFrame command, to debug grass map runtime generation.
Changed landscape tools with the "Combined Layers Operation" feature to use new selective layer render code.
Stops using old "intermediate render" code and avoids polluting the persistent texture data with intermediate results. The new version is faster and safer.
Moved the Landscape feature level warning (for shader modes < SM5) from a blocking notification to a simple console log.
Landscape optimization for the editor:
No longer inspects materials for finding mobile layer names when generating mobile weightmap allocations while there's no weightmap allocations in a given landscape component in the first place.
Performance optimization when undoing landscape edits.
Added a transient landscape property to track the last selected edit layer index. Edit layer selection state is persistent when toggling between editor modes.
Removed the ability to place Landscape Blueprint brushes from the Place Actors panel.
Added all landscape brushes from the Landscape Manage - Blueprint Brush tool.
Enabled dynamic Landscape Spline control point billboard size and offset in editor.
To change the offset and size, configure Spline Icon World ZOffset and Spline Icon Scale under the Landscape Project settings.
To maintain legacy spline behavior, set CVarLandscapeSplineEnableFixedSpriteIcons=True.
Removed the Landscape Spline Deform to Landscape buttons used to update spline data for non-edit layer landscapes. With edit layer landscapes, Landscape splines automatically affect the data when a Spline Edit Layer is added.
Added API exposure for all public BlueprintCallable Landscape Patch functions.
Exposed landscape component's GetGrassTypes to Blueprint.
Added generic World Partition Landscape Builder Commandlet. Builds all landscape grass maps, physical materials, and nanite components.
Improved landscape.DumpLODs command:
Now it only displays the landscape LOD information by default and -detailed needs to be used to get the verbose mip-to-mip delta information.
Added an option to align landscape grass instances with the precise triangle normal when using jittered grid mode.
Also fixed an issue with the triangle normal calculation.
Added API exposure to virtual functions on landscape patch plugin UCLASSes so that they can be inherited from in other modules.
Remove redundant and unsafe non-blocking landscape nanite build from PreSave. No longer builds Nanite at all on auto-saves.
Added an option to Add Unassigned Blueprint Brushes in the Landscape Edit layer context menu. If a Blueprint brush does not have an assigned edit layer, the right-click context menu will include an option for re-assignment
Added a DeleteActors helper in order to let the editor's delete actors dialog run when possible but also to let actors be safely deleted without using the UI in other cases.
Added Landscape Edit Layer Context Menu customization system.
Added the ability to easily extend right-click context menu actions for custom edit layer classes.
Moved LandscapePatch plugin out of Experimental.
UX improvements:
Updated icons to landscape target layers display order methods.
Added sort type (ascending/descending) for this.
The sort/filter options have moved next to filter box within the Layers property (since they affect only the layers that are visible, these buttons should not be present when the property is collapsed).
Added a number of target layers in the Layers property header, in order to be similar to standard arrays and also the edit layers property above.
Added Collapse All Edit Layers action to the Edit Layer context menu.
Removes all edit layers and flattens the current data into the default edit layer.
Updated default spline edit layer selection behavior:
Selecting the Splines Edit Layer no longer auto-activates the Splines tool.
Double-Click on the Splines layer, or use the right-click context menu option, to toggle between the Splines Tool and last active tool.
Bug Fix:
Fixed mobile landscape weightmaps not being taken into account by streaming.
Fixed a crash when auto-filling target layers from material.
Fixed height/weight alpha precision loss when merging landscape.
Fixed grid-alignment warnings when creating a landscape with more than one region worth of components.
Added refined Water Body underwater detection to avoid applying post-processing when the camera is underneath or outside the bounds of the collision volume
No longer calls UpdateResource when changing texture LOD settings for render targets. This fixes the water brush breaking landscape after switching between desktop mobile preview mode and desktop renderer.
Fixed landscape legacy weight blending potentially leaving ghost weightmaps on large landscapes.
Turned assert about landscape physical material tasks failing to complete on save into an error, since that is something that can happen if the material fails to compile.
Fixed a crash that happened when trying to clear a Landscape Paint Target Layer that was already empty.
Fixed a crash when a Landscape Blueprint brush was deleted and then restored via Undo.
Removed spurious assert when the landscape material references a texture named "Heightmap" (implicit name for heightmaps in landscape).
Fixed determinism issue when updating landscapes with conflicts on the border of landscape components that would lead to landscape proxies getting dirty in an inconsistent way.
Fixed an issue with World-Partition Landscape Proxy Nanite Materials not updating after using Undo/Redo with the Landscape Paint Tool.
Fixed invalidations of landscape physical material during painting.
The last few frames of a paint stroke could be lost because the invalidations were ignored while a physical material task was still pending.
Fixed several issues with ReinitializeHeight/Weights in landscape patches.
Fixed crash with multiple patches. The render command recorder was not stopped at the right moment: both Render and Blend operations must respect the render mode (Immediate or Recorded), which could be broken in case the renderer was grouped with another one earlier.
Fixed landscape that was not updated after having reinitialization had been executed.
Fixed a crash when the same patch is rendered in several batches. The boolean bReinitializeHeightOnNextRender does not support this and that supposes that during reinitialization, the patch is rendered in a single batch. The fix artificially increases the batch size to the entire landscape, which is wasteful, but the best we can do until the reinitialization is replaced by a proper landscape edit layer partial merge.
Fixed landscape batched merge not handling multiple weight patches (i.e. multiple target layers) being rendered on the same patch component (the render targets would cycle in between each, leading to invalid blending).
Fixed landscape patches' input area (which was the size of the patch), that would lead to needlessly large batches.
Fixed potential determinism issue with landscape patches that could theoretically render before their referenced textures are fully streamed in.
Handle null landscape patch weight entries in the couple of places where it was not.
Fixed invalid checks in landscape batched merge.
Stop over-invalidating on empty landscape components. Change to invalidating only components that added or removed weightmap allocations.
Fixed PCG refresh on undo/redo landscape painting.
Moved creation of landscape nanite's UStaticMesh out to the game thread to remove danger of threading issues.
Fixed improper blend of landscape edit layers with custom height/weight flags.
Avoided a crash if saving when FLandscapeTextureStreamingManager is not available.
Fixed a bad ensure condition when trying to cache data from an empty area in the landscape smooth/flatten/erosion tools.
Fixed a crash with the Landscape Copy Tool when attempting to copy data from an invalid or deleted landscape.
Fix deleted landscape spline points/segments coming back after duplicating the spline.
Fixed a crash occurring when saving level instances that include World-Partition Landscapes.
Fixed ctrl+alt+right click drag increasing/decreasing the landscape brush continuously even when the mouse was still.
Fixed mobile landscape data hash being zeroed when entering PIE. That was leading to all landscape mobile data being rebuilt when entering PIE while in mobile preview mode.
Fixed a landscape flatten tool conflict with undo.
Fixed landscape flatten tool behavior at the edges of geometry.
Fixed landscape painting errors when toggling "invert" during a brush stroke.
Fixed an issue with the Landscape Resize tool clearing all heightmap/weightmap data for edit-layer based landscapes.
Fixed an issue with Water Bodies automatically generating invalid collision boxes in the Blueprint editor when changing the Wave Source property.
Prevented a crash when redoing an undo of a Water Zone actor deletion.
Fixed an issue with the Landscape Resize tool using the wrong Y position offset while expanding the landscape.
Fixed the handling of changing transforms when building landscape groups.
Fixed additive blend mode for landscape texture patches.
Fixed various landscape+water new cases where it was assumed that GetWorld() returns a valid world while it's not the case when a world is deleted from the content browser.
Improved the Landscape Import/Export Exposed user experience by exposing the Landscape Gizmo location property to the Landscape details panel.
Fixed a crash updating landscape edge snapshots when heightmaps are not readable.
Fix landscape edit layers merge on Vulkan SM6.
Fixed a crash when renaming a Landscape Paint Target Layer to an invalid name. Target Layer names must be unique non-empty names.
Keep landscape patches in sync with their host landscape by upgrading them from the soft-dirty package list to regular dirty status when the landscape makes that same change.
Enabled landscape grass culling when running MRQ.
Previously we would pass an array of no camera to RegenerateGrass, which prevents all landscape grass from being distance-culled.
Instead, we now pass nothing, which leads landscape to use the streaming manager to get the current "views", one of which is the captured camera (the other, the editor).
This is better handled in the new movie render graph but at least this solves a performance issue in grass-heavy scenes. The user can now override the grass cull distance (as well as grass density) via Game Overrides settings.
Default = override + cull distance multiplier of 50, to have (mostly) backwards compatibility with the previous MRQ captures (which prevented all grass culling) The default for grass density override is false, though, also for backwards compatibility reasons.
Note that the new movie render graph doesn't have these settings since it doesn't have them for ViewDistanceScale, ShadowDistanceScale, etc. so we figured it didn't need those grass settings either.
Also added a CVar (grass.VisualLog.ShowCameraLocation) to show the camera locations used by landscape grass in the visual logger.
Now displays an error message instead of crashing when failing to import an image file to a landscape layer.
Avoided a crash on opening a scene containing the legacy LandscapePatchManager when the scene was already at the max number of edit layers. Ignore the soft limit when creating the new dedicated patch layer.
Fixed OOBB->AABB computation in landscape batched merge, which was leading to bad blend groups for landscape patches.
Fixed an issue with landscape brushes that would sometimes modify height/weight data on the border with unloaded tiles.
Avoided a crash when opening a map with a disconnected landscape patch manager, when the editor isn't ready to provide the current selection set.
Fix for Nanite landscape possibly generating invalid Nanite mesh streaming data on cook.
Added an option for landscape Blueprint brushes to tell if they require power-of-2 render targets to operate. For backwards compatibility reasons, it's set to true by default, although it's not the best option. This ensures that the water brush behaves precisely how it used to before UE 5.6
Fixed the water brush on Vulkan SM5.
Fixed an issue where Landscapes only generate Nanite for the first 64 components of any given landscape proxy.
Fix missing landscape spline meshes after undo of merger of two splines.
Now hides the landscape selector when the New tool in the Manage panel is active.
Fixed a rare crash in the landscape texture streaming manager when landscape textures are GCed while the landscape is still active.
Fixed missing updates to landscape physical material when using a material instance.
Fixed a crash using Undo operation with a Landscape Patch and Patch Edit Layer.
Landscape add component tool fixes:
Now properly generates extrapolated height data on each persistent edit layer, so that there's continuity on the corners on each of them.
No longer generates collisions on component creation because at this point, the height data is set to all zeroes (i.e. the minimum height, not the median, default height value) and doesn't correspond to what comes out of the the subsequent edit layers merge, whose readback would generate an identical heightmap hash, and would therefore not re-generate collisions. Delaying collision generation until the merge fixes this, since that's the first time the collision values would be valid anyway.
Now prevents existing neighboring components from being dirtied when adding a new component (previously they would get dirty by the simple act of caching/interpolating their height data).
Automatically apply splines after component creation, so that new components are immediately affected by the splines that overlap with them.
Improved visualizer for the component about to be added.
Prevent landscape edge fixup from running on world composition maps, where heightmap sharing is still possible.
Fixed all logs involving landscape LandcapeGroupKey and LODGroupKey.
Fixed ensure loading old landscape data with landscape.StripLayerMipsOnLoad = false.
Fixed a crash occurring after exiting a level instance with the Landscape Editor - Landscape Copy tool active.
Deprecated:
Deprecated legacy non-edit layer landscapes:
Removed all editor tooling related to non-edit layer landscapes (e.g. Landscape Retopologize Tool/XY Offset data).
Disabled the creation of non-edit layer landscapes and the ability to toggle between edit layers and non-edit layer landscapes.
When non-edit layer landscapes are loaded, an automatic conversion to an edit layer based landscape occurs. During this process, all proxies copy the existing non-edit layer data to a new default edit layer. Any existing Retopologize data is removed and the proxy is flagged as "soft dirty" with an editor viewport warning.
Removed global and local merge code and deprecated anything that was only available for this.
Since the console variable "landscape.EditLayersLocalMerge.Enable" is deprecated now, a new console command was added, to trigger a landscape layer full update (landscape.ForceLayersFullUpdate) :
With no argument: Updates all landscapes.
With arguments: Updates all landscapes whose display name (partially) matches the argument (e.g. with 3 landscapes named Landscape_0 Landscape_1 and Landscape_2, "landscape.ForceLayersFullUpdate _0 _1" will trigger an update on the first 2 only)
Changed landscape edit layers merge API from experimental to official.
Removed landscape's "intermediate render" code path.
Modeling Tools
New:
Added support for the tangents tool to choose the reference UV layer to use when computing tangents.
Added BrushValue property to the AttributePaintTool to allow users to specify the target value that is painted down rather than always accumulating to 1.0f.
Added symmetry support to the Paint Vertex tool.
The target requirements for the Inspect tool have been relaxed to support DynamicMeshProviders rather than MeshDescriptionProviders.
Modify UBoundarySelectionMechanic to be able to operate on either closed loops (current behavior) or open spans (new optional behavior).
Lattice Deformer Tool:
Modified the FFDLattice to optionally accept an oriented bounding box rather than computing one from the input mesh. This means the lattice can operate on just a portion of the mesh. Lattice computations are now all done in local space.
Added an ILatticeStateStorage interface, which enables the interactive LatticeDeformerTool to store its state in when the tool ends.
Added support for a HitBackfaces option to the MeshAttributePaintTool.
The attribute paint tool now has the option to use a more-shaded material.
Added an option to the Mirror tool to averaging normals along the weld.
Bug Fix:
Fixed a crash on attempting to split meshes w/ invalid material IDs.
Fixed an issue where the AttributePaintTool's stamps would be skewed for meshes with non-uniform scale.
Fixed where modeling tools could incorrectly change material ID assignments due to the static mesh tool target 'IMeshDescriptionCommitter' interface not finding the right material ID mapping method.
The same function is also on the Provider, so needed to be pulled to the top level for both interfaces to find the method.
Made vertex sculpt tool skip render decomp step if the sculpt mesh has no triangles (fixing ensure when tool is run on an empty mesh).
Fixed a crash in the subdivide tool. We were passing in the wrong vertex count to OpenSubdiv.
Fixed a potential crash when enabling UVLayoutPreview.
Fixed a warning about realtime mode erroneously appearing in modeling and scriptable tools modes when the editor doesn't have focus.
Fixed a potential crash in DisplaceMeshTool for meshes with invalid topology.
Fixed a GC crash with mesh element selection's usage of PreviewGeometry.
Fixed support of the 'join method' for closed curves in the Mesh Splines tool (previously always used 'square' joins).
Fixed a crash on starting modeling mode w/ an actor selected that has null components attached.
Fixed a crash when swapping from Modeling Mode to Animation Mode with Motion Trails active.
Fixed a potential crash in the ISM Editor tool.
Fixed a potential nullptr dereference crash in OnActiveViewportChanged for StylusHandling.
Fixed the OutputType properties' display name and tooltip to SourceType in the BakeVertex tool to better reflect the function of those properties.
Fixed an issue where tools in Modeling Mode and Scriptable Tools Mode would not tick if the viewport did not receive focus yet during the editor session.
Fix for crash in Extrude Path tool when creating a totally straight polyline.
Fixed a rare crash when hovering over Mesh Element Selection before viewport is focused.
Fixed Mesh Splines tool handling of duplicate start/end points generated on looping splines, which could previously cause incorrect triangulations.
Lattice Deformer Op: Fixed a check that fires when operating on non-compact meshes.
Fixed an issue where the Union tool only transferred UV Channel 0 in the result mesh.
Fixed a potential crash in TDynamicVector::TruncateBlocks for an empty vector.
Added a workaround to prevent a crash in UVAtlas.
Normal seams on dynamic meshes are now automatically hard edges when converted to mesh description, which can better preserve sharp features when the dynamic mesh is used for editing a static mesh or skeletal mesh asset.
Reduced confusion during displace tool computations by adding a slight delay to the appearance of the 'in progress' material.
Addressed a bug which displayed random gizmo orientation in local space in the PolyEdit tool.
Fixed an error in AddSingleClickBehavior and AddDoubleClickBehavior function tooltip.
Fixed the StaticMeshSelector only working on exactly StaticMeshComponents.
Procedural
New:
Added "SetWorldObject" on the PCG Data Exporter for Blueprints.
Objects can't be cast to World in Blueprints, and when doing an utility widget, Get Selected Assets returns an array of objects.
Does the cast internally, returns false if the cast fails.
Added support for skeletal meshes in BoundsFromMesh and PointFromMesh.
Deprecate StaticMesh property to Mesh property in PointFromMesh, with override alias
Added a new "Extract Attribute" node to extract any attribute from any data and domain.
Factorized code for Get Attribute From Point Index.
Get Attribute From Point Index now works with data domains too.
Added the Polygon2D data type, that represents a 2d polygon (e.g. on a plane), with an additional transform. Has some polygon specific metadata properties on both the data domain and the vertex domains.
Added Python Interop Plugin and Execute Python Script Node.
Stand up the Break Debugger debug feature for GPU nodes, and make the breakpoint conditional on inspection so that it is usable in partitioned/higen use cases.
Fixed multiple performance bugs where GPU-resident data is unnecessarily read back when passing through Change Grid Size nodes.
Added toggle to GPU nodes to trigger render captures for debugging (editor only).
Added GPU processor node for Attribute Sets.
Fixed runtime generation bug where changing Partition Grid Size setting on PCGWorldActor resulted in generated actors being leaked into the level.
Added re-nameable categories for organization in Graph Parameters + Includes Drag and Drop.
Improved priority calculation in distance and direction runtime generation policy to behave more uniformly across grid sizes and to be easier to tweak.
Note: May require re-tweaking if non-default weights were in use.
Added Generate Landscape Textures node that can generate a height map as well as grass maps from the landscape. This path does not rely on virtual textures, and is significantly more efficient than the CPU path.
Added LLM tags for tracking memory allocations.
Added a get segment node that allows the user to retrieve a segment from a polygon 2d, spline or point data, in the form of two points or a spline containing a single segment. Support negative indices (-1 being the last segment) in all cases and hole support for polygons.
Added 'Clip Paths' node to cut paths (points or splines) with clipping polygons. Supports either difference or intersection.
Add new property for data that supports elements: @Data.$NumElements.
Useful to combine with Filter Data by Attribute.
Added the concept of read-only for properties in the Selector menu to not show for output.
Applied this concept to Polygon2D properties.
Added support for property remap when converting back and forth between Attribute Set and Points
Saves adding "Copy Attribute" nodes to do the conversions.
Added option to disable default input creation for top-level graphs. Will become default eventually.
Improvements on Boolean and Bitwise op.
Boolean op now supports arithmetic types as input, still produces a bool as output.
Added operators NAND, NOR, XNOR, IMPLY, NIMPLY.
Added ShiftLeft/Right for Bitwise.
Added "AddModulo" operation in maths node.
Do operation (A + B) % C .
Useful to get the ($Index + 1) % NumPoints.
Added comma-separated tag list (override) to create target actor node.
Added polygon offset functionality (offset positive or negative, open and close holes).
Added polygon operations (intersection, difference, union, inner intersection, exclusive or, cut polygon with paths).
Added GPU implementation of Transform Points.
Added change detection to runtime generation state to throttle scans over grid cells, saving per-frame Game Thread cost.
Added 'Split Spline' node to split splines based on a few criteria (key, distance, alpha) or on a predicate on control points.
Add `IsBuilder` to Get Execution Context node.
Needed to know which component the builder was scheduling.
Added that information to the PCG Editor Module, which can be queried through IPCGEditorModule.
Add helper function to get the result from the IPCGEditorModule.
Added support for attribute curve remap.
Added a new mode in the existing attribute remap node.
Added an alias for curve remap.
Also exposed ExternalCurve for the spline sampler (with the new PCG_OverridableChildProperties).
Added a 'Spline Intersection' node that computes intersections between splines (in 3d).
Added a debug feature that repeatedly dispatches the compute graph to enable profiling, compiled out by default (PCG_GPU_KERNEL_PROFILING).
Added String Contains and Matches nodes and .Length extractor + Extractor:
.Length - Length of the string
Contains - Whether string A contains substring B
Matches - Whether string A matches string B exactly
Added Cvar pcg.GPU.FuzzMemory which initializes GPU buffers to random values during execution to help catch uninitialized data bugs and other undefined or unreliable behaviour.
Added the ability to retrieve the ray hit material with GetMaterialFromCollisionFaceIndex, instead of needing to specify a material index.
StructUtils: Added new features to the Property Bag Details View Child Row Widget:
Customizable via the EPropertyBagChildRowFeatures enum (set via metadata specifier).
New STypeSelector widget (wrapper around SPinTypeSelector) for type selection.
New Access Specifier button.
New drop down menu.
Added 'Get Asset List' node to get assets from a folder or from a collection. Can extract asset classes and generated classes when these are blueprints too.
Anim - SkinnedMesh: Exposed SkinnedAsset and TransformProvider on FSoftSkinnedMeshComponentDescriptor.
To have parity with the non-soft version.
To be used for the Instanced Skinned Mesh Spawner in PCG.
Nanite Assemblies: Initial prototype of Nanite Assemblies builder to support creating Static Meshes.
Interop plugin, as this is still very experimental.
Added specific graph cache enabled and budget CVars for editor worlds vs game worlds.
Can now override nested properties in the Static/Skinned Mesh Spawner.
Bug Fix:
Fixed multiple cook warnings arising from GPU node kernels.
Fixed bugs with CreateGrid2D and CreateGrid3D Custom HLSL helper functions where the NumRows/NumCols arguments were not used correctly.
Fixed Filter Elements by Index node's indexing issue.
Now supports Attribute Rename for Selectors and Data domain.
Improvements to Spline Mesh spawning.
Component class is now respected when spawning the spline mesh.
Added override on the component itself, if users have special fields they want to fill.
Fixed an outstanding issue in package build where the Switch and MultiSelect nodes can fail if the DisplayName is different from the real name for an EnumValue.
GetDisplayName won't return the display name in package build but the real name.
Since we use the Display name for naming the pins, we need to keep a mapping.
Fixed Create Points Sphere crash from divide-by-zero when graph params are used to set degrees to 0.
Fix bool attribute in Write to Niagara Data Channel.
Writing bool values was crashing.
Fixed bug causing Inline Constant not to respect required pin.
Fixed Per data CRC caching issue when there are N:N mappings, which was the case in some configurations of the Match & Set node and the Distance node.
Added support to call Pre/PostEditChange on objects on ApplyOnObjects.
When overriding objects with ApplyOnObject node, we call Pre/Post Edit change to have any pre/post processing to do after a change.
Fixed an outstanding bug in match and set attributes for attribute sets in keep unmatched mode.
SetAttributes metadata entry keys arguments were in the wrong order.
Can now drag and drop in the graph any asset that is a subclass to UPCGBlueprintElement.
Fixed the RemapMaterial not working if the target dynamic mesh didn't have any material.
This was breaking appending a mesh with materials to an empty dynamic mesh, for example.
Fixed erroneous readbacks and re-uploads of arrays of GPU data items that are not placed first in the compute graph's input data collection.
Texturing Tools
New:
Improvements to UCurveLinearColorAtlas.
A bug was fixed which caused nearly black negative values to become white.
TextureHeight of Atlas is now automatically set to the number of curves.
The default width of new atlases is now 64 instead of 256.
Interactive updates are now much faster.
The UV scale for sampling atlases is now fixed so that the U range of [0,1] goes from the first to last pixel center. Old atlases will automatically be updated for these changes.
Added Virtual Texture feedback and warmup support to TextureGraph material rendering nodes.
Virtual texture samples will now stream to the correct mip level before the final render.
Added a new console variable to control the warmup length: "TG.VirtualTexture.WarmupFrames".
UV Editor
Bug Fix:
Fixed localization issue for the "Advanced Transform" category label.
Fixed UVEditor launch conditions to support BP actors with mesh components.Fixed an issue where the RMB context menu would not display the UV Editor option for actors with any invalid components.
World Building
New:
Added a Save Texture to Asset node (editor only).
Added a world partition function to insert a new runtime cell transformer.
HLOD:
Support Spline Mesh Components in Approximate Mesh HLOD.
Added world partition validation to detect actors having a HLOD Layer which doesn't support that actor class. Rules can be specified using a config file and violations trigger a warning.
Standalone HLOD: Added AWorldPartitionHLODOnlyLevelInstance Actor to allow users to place Standalone HLODs in the world without having to add actual Level Instance to the world
After adding the actor to the world users can select the level for which Standalone HLODs should be loaded.
The actual level is neither loaded nor cooked. It's only used by the Standalone HLOD Subsystem to pull in the corresponding Standalone HLOD levels.
Add overridable attribute support to CustomHLSL node
Custom HLOD support:
Added WorldPartitionCustomHLODActor, an actor you can place in the world to provide a custom HLOD representation (using static mesh component).
Added a new HLOD Layer type: "Custom HLOD Actor".
Custom HLOD actors assigned to "Custom HLOD Actor" layer are injected as-is into the HLOD runtime partition.
The "Custom HLOD Actor" layer can specify a parent layer. In that case custom HLOD actors are also used to generate parent layer's HLOD representation.
Custom HLOD actors can also be assigned to other (non-Custom) HLOD Layers. In that case they are used only during HLOD generation and are not pulled into the HLOD partition themselves.
Adds a new LinkedLayer property to UHLODLayer, visible only when LayerType is set to Custom HLOD Actor
LinkedLayer is used to control the visibility of Custom HLOD Actors. They become visible when actors from the LinkedLayer are unloaded.
If LinkedLayer is not specified, Main Partition is used to control the visibility.
Added a SceneCapture node.
Added GPU implementation for CullPointsOutsideActorBounds.
Now supports overridable attributes on GPU nodes.
Added a world partition function to check if runtime cell transformers are installed.
Cell Transformer: Improved handling of components that can be ignored.
FastGeo: Moved FastGeoContainer PSO Precaching from PostLoad (GameThread) to be asynchronous.
Added grid streaming dependency mode to scheduling policy
Move PCG GPU from Experimental to Beta.
Bug Fix:
Standalone HLOD:
Fixed a crash when adding a standalone LI with standalone HLOD to a non-WP world.
Made sure that Standalone HLOD Actors are injected into appropriate containers during streaming generation.
Fixed attached spatially loaded actors not being GCed when AttachParent exists.
EDL: Fixed handling of EDL injection of client-only cells in cases when it happens after BeginPlay Removes irrelevant cells from cells lists during the injection.
Foliage Editor Subsystem: OnActorMoved optimization to avoid expensive TActorIterator operations when no work is done inside the TActorIterator loop.
HLOD: Fixed distributed HLOD builds running on non-WP worlds not doing any work.
WPBuilderCommandlet: Fixed logging when processing additional maps.
Standalone HLOD: Fixed logic that generates the list of Standalone HLOD levels returned by ShouldProcessAdditionalWorlds, to correctly handle cases where the number of HLOD Setups differs from the maximum HLOD hierarchy depth.
FastGeo: Fixed a crash on mac caused by TArray relocation of FFastGeoPrimitiveComponent which contains a FRWLock.
[Cell Transformer] Replaced references to objects that could be recreated during RerunConstructionScripts triggered from ApplyRuntimeCellsTransformerStack in Standalone Editor.
Fixed a crash while level editing. Deleting an actor inside a level instance then pressing save in the bottom of the level viewport would crash in some situations.
Media
Media Viewer (Beta)
New:
Extra keybinds for videos:
Fixed spam of updates when offset / scale was not changing.
Exposed delegates to the public API so it can be used in the image viewer overlay.
Transform lock now also duplicates media playback controls between players.
New dragging options:
Revamped dragging system a little to support more zoom types.
Added alt+rmb to zoom (in addition to scroll wheel).
Added alt+mmb for panning (in addition to left click).
Improved level editor viewport robustness:
Made sure all settings have default values.
Moved level viewport render to end of RT thread event.
Added cross-thread robustness to the pixel color system.
Media track section:
Added a media track section that lists tracks in sequencer that have a media texture.
Added the refresh dynamic group button.
Images now support yaw rotation.
Added a clear history button.
Added Snapshot category.
Bug Fix:
Fixed controls to properly display when playing in reverse.
Also added keybind info to tooltip buttons.
Media Viewer / Media Player Editor:
Added scrub event to IMediaPlayerSlider.
Integrated scrub event to allow dual scrubbing.
Fixed bug in file drag/drop for media viewer not allowing comparisons to current image.
Media Stream: Fixed for packaged games.
Fixed crash relating to viewport.
Added texture size constraints to render calls.
Fixed struct initial values.
Fixed a crash with invalid library thumbnail.
Fixed changing splitter location in single image mode.
Media Stream:
Corrected the "Add Track" button for Media Sources.
Will now always display the button, but disable it, rather than hide it, when it is not available.
Added tooltip to the button explaining what it does and when it is usable.
It is now disabled if the Media Stream's world is not the level level sequence's world.
Fixed relevancy issue for Sequencer.
Fixed Sequencer binding issues.
When locked scrubbing, the videos not being directly scrubbed is paused.
Invalid assets are removed from history when the tab is opened.
When in dual view and without an A image, the slider position now works correctly.
Fixed pixel sampling for compressed images - All pixel samples now work via a render target.
Fixed an issue with A-image not being displayed behind B-image when the slider was set to 0%.
Right click asset fix: There's now a maximum parent check for material instances
Fixed crash when 2 viewport tabs are open.
Added cross-thread hardening for pixel sampling.
Added more texture encoding types to the no-read-with-rhi list.
You now must supply a unique name when saving snapshots.
Toggling the overlay while in comparison mode no longer blocks the custom image ui (i.e. video control overlay).
Mobile Rendering
Mobile Lighting
New:
Translucent objects now receive CSM shadow when surface lighting.
Mobile Postprocessing
New:
Added EUpscaleMethod::Area and swapped in for PrimaryUpscale using the mobile renderer to reduce blurriness at low screen percentages.
Online
Crash Reporter
New:
Apple:
Unified crash dump format on iOS & Mac to crashlog
Added commandline/ini override to enable crash dump on iOS.
Upgrade PLCrashReporter to 1.12.0 and apply our existing modifications by diffing 1.8.1 vanilla & our modified 1.8.1
HTTP
New:
Added an option to enable different http versions per IHttpRequest via SetOption(HttpRequestOptions::HttpVersion).
Limit the number of concurrent HTTP requests by default. This helps avoid connection timeouts when queuing up very large numbers of HTTP requests.
Bug Fix:
Fixed Blueprint compilation crash due to mismatching pin names.
Fixed a low rate crash in HTTP requests.
Online Subsystem
New:
OSS for GDK: Propagate the checkout failure error codes from GDK APIs into PurchaseFailure and PurchaseFailureStart errors.
OnlineServicesCommon: Added TOnlineAsyncOp::GetWrappedHandle to transform the result of an operation to simplify cases where one operation is implemented in terms of another.
Added OSSv2 PSN Connectivity interface.
Bug Fix:
Fixed OnlineServicesNull handling FPartialUpdatePresenceFix FPartialUpdatePresence not merging RichPresenceString.
"ENABLE_PGO_PROFILE 1" Shipping configuration can now disable online subsystems from the commandline.
Fixed Push Event related issues
Fixed FNpPushEventWrapper::Initialize not correctly handling callbacks disposing.
Fixed OSSv1/2 FNpPushEventPushContextWrapper not handling TOptional value safely
Fixed crash in FUserManagerEOS::ReadFriendsList callback when user failed to authorize.
OnlineSubsystemIOS: Fixed a race condition that caused a purchase to fail when purchasing an offer immediately after finalizing a successful purchase of the same offer.
Deprecated:
Removed deprecated GoogleSignIn support from OSSGoogle for Android.
Platform
Linux
New:
Upgraded toolchain to LLVM 20.1.8
Added preliminary support for BuildCMakeLib from Linux.
Add -NoStripSymbols to UBT to support build systems where stripping needs to happen later in the process.
Bug Fix:
Re-enabled PreLoadScreens.
Now skips chmod +x dotnet if file is already executable. This addresses permission errors if UE is run on a read-only file system on Linux.
Fixed an issue where BuildCMakeLib can produce .so files that depend on system shared libraries.
Fixed loss of precision when FLinearColor is requested in VulkanDynamicRHI::RHIReadSurfaceData.
Updated FLinuxPlatformProcess::BaseDir to support -basedir=.
Mac
New:
Inline Ray Tracing is now available for Mac platforms running with the SM6 renderer.
Parallel translation of encoders is now enabled by default on Mac (and can be used on iOS). This gives a significant reduction in overall RHI thread time.
Compute shaders are now executed with concurrent dispatch on iOS and Mac platforms. This provides a significant performance boost when using Nanite.
Adding Metal-strip to lib processing to reduce metallib sizes (around 10% reduction).
Delete iAD framework (deprecated) from Core.Build.cs.
Mac: Included Mac MainThread in CrashContext.runtime-xml for CrashReporter.
Added support for Aliased formats to be explicitly declared enabling optimisation on Metal platforms.
Bug Fix:
Fixed tweakobjectptr debug on Mac OS.
Fixed process reaping to be non-blocking and not leaking.
Fixed an issue where on Mac/iOS SM5 uniform buffers were bound to indices that were unnecessarily high, which caused validation errors in the RHI.
Stopped the submission thread getting stuck when encountering a NotPermitted GPU error.
Fixed bug where Metal runs out of counter sample buffers.
Metal now longer breaks encoders by default when profiling, this can still be enabled with GMetalSampleComputeEncoderTimings and GMetalSampleBlitEncoderTimings.
Mac:
Fixed Cursor offset from visual because of an outdated ScreensArray when processing OnWindowDidMove, resulting from a DPI change.
Fixed MainThreadChecker issue in FMacApplication::OnWindowDidMove. Move bDisplayReconfiguring from FCocoaWindow to FMacApplication since it's not dependent on FCocoaWindow
HairStrands: Disable HairStrands rendering on Mac SM5.
ApplePlatformFile: Refactored to use the common implementation FFileHandleRegistry to support more than the limit of read-only opened files.
Changed Fatal log to a Warning when posix_spawn fails in CreateProcInternal, for consistency with Windows, and to prevent unnecessary crashing.
Fixed DPI scaling bug which could cause Mac's to render at 2x res when using PIE.
Fixed performance issue on editor start up with mdfind taking multiple minutes due to matching incorrect types.
Fixed potential bug where bindless handle could be null when retrieving viewport texture.
Online
New:
Updated GooglePlay Billing library to 7.1.1 in OSSGooglePlay
Bug Fix:
Pixel Streaming:
Fixed a crash when streaming with Pixel Streaming and a user attempts to enter text through the stream text modal on a multiline text element.
Fixed a crash in the editor when setting the streamID on the command line and streaming with Pixel Streaming.
AVCodecs: Encoding frames with VP9 can now have odd pixel width or height.
Windows
New:
Moved Win32 calls for mouse cursors off of the game thread and onto the task graph to reduce stalls on the game thread from internal lock contention that occasionally occurs.
Moved processing of mouse inputs to a dedicated thread to reduce overhead on the game thread for Windows. This is useful for mice with high polling rates, e.g. 8000 Hz.
Made Clang 20 the preferred version of Clang on Windows.
Changed thread priorities for Game, Render, and RHI threads from Normal to AboveNormal on Windows.
Increased MinimumWindowsX64TargetVersion from 0x601 (Windows 7) to 0xA00 (Windows 10) to make more functionality available directly from Windows headers.
Bug Fix:
Ensured that shared resources are created as committed resources for improved compatibility.
Changed our heap VA computation for transient resource allocations on Windows to fix D3D12 call failures on some GPUs.
Fixed FWindowsPlatformMisc::SetEnvironmentVar to unset the variable if it is null or "", just like on Mac and Linux, and .NET 8.
XR
New:
Added native support for the OpenXR XR_EXT_frame_synthesis extension, including Application SpaceWarp (AppSW) on Meta Quest:
To enable, set:
r.Velocity.DirectlyRenderOpenXRMotionVectors=1 (read-only)
xr.OpenXRFrameSynthesis=1 (toggleable at runtime).
Currently only supported on the Vulkan mobile forward renderer, and cannot be used alongside features which require standard velocity rendering (such as TAA/TSR).
Added Android Runtime category tag for immersive mode selection.
See https://registry.khronos.org/OpenXR/specs/1.1/html/xrspec.html#appendix-android-runtime-category
AddedIOpenXRExtensionPlugin hook OnCreateHandTracker().
OpenXR XR_EXT_user_presence is now supported:
Added support for the user presence extension, which tells us whether the hmd is being worn if the platform supplies that information.
Removed the previous implementation which attempted to drive the worn state from other openxr state transitions. This had inconsistent and sometimes broken behavior across platforms.
Replace xr.MobileLDRDynamicResolution with a new CVar, xr.MobilePrimaryScalingMode, which controls whether primary scaling is redirected to the HMD runtime (which will always use spatial scaling) when it would otherwise be unsupported.
Options are:
0: Never
1: DynRes Only (default)
2: Always.
Updated device profiles for standalone XR devices. They no longer inherit from each other in sequence, and the new Android_OpenXR device profile matches the Quest 3 profile which has had its shadow quality increased for dynamic shadows to draw by default in Mobile Preview and on Device. Consider lowering this value if dynamic shadows are not required.
Improved expose passthrough support via the editor:
Added a new UENUM for environment blend modes, EOpenXREnvironmentBlendModeUpdate SetEnvironmentBlendMode() node to accept EOpenXREnvironmentBlendMode.
Added a new GetEnvironmentBlendMode() node.
Added a new GetSupportedEnvironmentBlendModes() node, which returns supported blend modes in an array in order of runtime preference (highest to lowest).
Added a new IsCompositionLayerInvertedAlphaEnabled() node.
Added an xr.OpenXRInvertAlpha checkbox to the OpenXR plugin settings.
Added an r.Mobile.PropagateAlpha checkbox to the Engine->Rendering->Mobile settings
Renamed OpenXRHMDSettings to OpenXR Settings, since it controls settings for the entire module.
OpenXR is now building for all platforms:
The platform specificity of the openxr plugins and modules was problematic because content derived from these would not load on non-xr platforms for projects that are meant to be cross platform.
OpenXR is not actually platform dependent. It can be implemented on any platform. If it is present as a fully independent openxr runtime a small amount of platform specific code is needed to implement an openxr loader.
It is also possible to create an unreal plugin which either acts as an openxr runtime or is able to find an openxr runtime.
The plugins are still disabled by default.
Bug Fix:
Removed permissions not allowed by Quest App Store.
Fixed various debug draw elements failing to render when using Instanced Stereo or Mobile Multi-View:
r.VisualizeOccludedPrimitives
ShowFlag.Bones
DrawDebugBox and other similar calls, excluding DrawDebugString.
Fix a bug where late update camera movements were not accounted for when calculating scene visibility, causing smearing, latency, or other artifacts when some rendering features were used.
Fixed GetHMDData TrackingStatus field:
It was only checking if the hmd device tracking handle was valid, needs to check if the hmd is actually tracked.
It was also attempting to use the camera position rather than the hmd tracking position.
Removed GetMotionControllerData and FXRMotionControllerData which were deprecated in 5.5.
Added handtracking permissions for Quest.
Fixed OpenXR AddProfile for input always being given true rather than the passed in bHasHaptics parameter.
Fixed a crash when using the SteamVR runtime with Vulkan.
Fixed MetalViewport SubmitImmersive: [IOGPUMetalCommandBuffer setProtectionOptions:]:585: failed assertion `setProtectionOptions: with uncommitted encoder'
Fixed Visionos cp_frame_query_drawable null handling:
We abandon the frame if the drawable is null, this indicates that the app is either being paused or exited.
Essentially we just continue the frame but don't call the cp_ functions.
At the beginning of the next frame we handle the state change.
Deprecated:
Deleted the formerly deprecated functions from 5.3 to remove references to the UPlayerMappableInputConfig type.
Platform Mobile
Android
New:
Added -FastIterate flag to Visual Studio/Rider/Quick Launch, to have libUnreal.so outside the APK, and made build iteration faster in general.
Added -AndroidStudio flag to GenerateProjectFiles that generates a Gradle project that wraps around the original Gradle project that is suitable for use in Android Studio.
The Android Vulkan detection logic now uses the same VkApplicationInfo parameters (e.g. App name, Engine version) as used by the VulkanRHI initialization, so graphics drivers that need to opt out of Vulkan for Unreal Engine apps can do so consistently.
Implemented support for factoring screen rounded edges in computing the safe zone. The implementation means users can align the safe zone horizontally or vertically to the rounded edge excluded areas or to an average of both.
Additionally, cleaned up current safe zone implementation to determine size relative to the main view instead of the display as the system may reduce the main view to exclude cutout areas.
Constrained kotlin stdlib dependencies to >= 1.8.0 to fix building issues.
Recompiled libopenxr_loader with 16kb page support based on NDK 27.2.
Removed need for security token for debuggable applications when using AndroidFileServer with UnrealAndroidFileTool.
Added warning if a library on Android is not 16kb page size compatible.
Removed bashrc/bash_profile related code, instead using zshrc for Mac as primary source of environment variables.
Report resident size of "libUnreal.so+base.apk+[anon:.bss]+[anon:linker_alloc]" as ProgramSize on Android.
Report resident size of all memory mapped files as MMIO on Android.
Tag all virtual memory with "UE" VMA tag on Android.
Added the vkquality 1.2.2 library which can be used as another data point as to whether to select Vulkan or OpenGL ES.
The result of the vkquality check is returned in the SRC_VKQuality that can be queried by the Android device profile selector rules.
Updated AutoSDK "MinVersion" to NDK r27c.
Improved AndroidFileServer (AFS) file transfer - retries and resumes for file push to device.
Resolves potential sync issue that leaves the EditBox non responsive to text input and the keyboard in a state where it doesn't get dismissed its the 'Done' button.
Additionally, replaced setVisibility with add/remove View to work around an Android level spam issue when keyboard is repeatedly dismissed/invoked.
Improved Android Camera Player with the Android Camera2 APIs and support for Vulkan frame data processing.
Default NDK is updated to r27c, buildtools to 35.0.1, bundletool to 1.18.1.
Recompiled libopenxr_loader with 16kb page support based on NDK 27.2.
Replaced libhwcpipe with C wrapped .so to avoid C++ STL ABI conflicts on Android.
Now starts loading libUnreal dependencies early for faster startup time
Created Android-arm64/x64 configs in Visual Studio.
Made Quick Launch now build an x86_64 binary when launching on x86_64 devices, such as the emulator.
Lowered Android SDK "MaxVersion" to NDK r28c, due to NDK r29 compiler bug.
Update GooglePAD to 1.15.4 / 2.3.0.
Added engine device profiles for Mali-G1-Ultra and similar devices.
We now detect devices using the ANGLE OpenGL ES driver and use the Vulkan deviceName string for SRC_GPUFamily. This means the device profile Vulkan selection can continue to match the same string as used when the device is in native OpenGL ES mode.
Bug Fix:
Enabled desugar for older Android support.
Filtered out AFSProject task if running it from Gradle (prevent second run).
Ensured java sources are wiped when FirebaseEnabled is toggled off. Otherwise, source files are left behind that don't compile as the Java dependencies don't get populated by the plugin when FirebaseEnabled = false.
Additionally, registerBuildSettiings for the Firebase settings referenced from the plugin's UPL.
Fixed the timing of firing the MediaOpened event in Android Camera Player.
Fixed the issue that the Console Command input is disabled when "Show Launch Image" is off in Project Settings.
Ensured keyboard OnTextCommitted messages are dispatched when using Android improved virtual keyboard.
Ensured nativeKeyboardInputResult is invoked when keyboard is dismissed and keeps the reference to VirtualKeyboardWidget valid until the result is handled.
Corrected issue with file locking in UnrealAndroidFileTool for writes.
Fixed black screen when playing start movies.
Added a watch for deletion complete before database close in Fetch2 (part of background downloading).
Moved early load sync point to prevent possible crash due to an ordering issue.
Made NDK toolchains detection for manual SDK installs more robust.
Made JAVA_HOME environment setting for manual SDK installs more robust.
Added missing setting of ndkPath to Gradle property value
Fixed generated install scripts with overflow OBBs that are broken on non-Windows
Updated Breakpad dump_syms with version supporting compressed symbols.
Added catching of UnsatisfiedLinkError in GameApplication.LoadLibraries, in case some other ClassLoader has already loaded them
Fixed the WebView freeze when switching the game to the background while loading a URL.
Fixed VersionScriptFile not being created robustly, sometimes causing build failures.
Worked around a Gradle bug whereby when only assets change, it attempts to patch the existing APK from previous packaging by adding asset deltas resulting in growth of the final APK payload. Workaround is detection of changes to assets and wiping the existing APK to force Gradle to repackage it correctly.
Fixed a Java exception when closing the Camera Device during initialization.
Fixed the "Play On Open" feature for the Android Camera Player.
Fixed the keyboard EditBox layout on devices with cutout when the cutout area isn't used.
getWindowVisibleDisplayFrame returns a rectable in screen space, however, the edit box coordinates need to be provided in the main decor view's space.
As such, translate the results of getWindowVisibleDisplayFrame to the decor view's space by translating these by the decor view's screen position.
libGPUCounters: Android early crash fix libGPUCounters is built with statically linked libc++, exposing a bunch of std symbols, which override those in libUnreal.so.
For example, it overrides std::to_string leading to an early crash:
Other plugin calls to_string (uses libGPUCounter implementation and its operator new & memory alloc).
That string is later destructed, using engine's operator delete.
Our allocator fatals on unrecognized pointer.
The fix is to add a linker version script to the libGPUCounters build and only expose C API related symbols as global.
Updated Android TargetSDK Fix templates with AFS configuration.
Updated Fetch2 3.3.0 with new version of androidx.room 2.7.1 (used for background downloading).
Added detection of SQL lock error on enqueue (can happen after deleteAll in Fetch2 background downloading).
Added new dump_syms_comp.exe supporting compressed Symbols for Android use.
Fixed an issue with assets with starting offset other than 0.
Made MakeApk do a clean during packaging if EnableBundle is flipped between builds.
Fixed crash from pending JNI exception in non-Shipping builds, when skipping over checks.
Now round rather than truncate Android getRefreshRate when converting to integer.
Fixed the freeze of Android Media Player playback on Xiaomi 13T or devices with a similar chipset.
Fixed TargetSDK 35 compatibility issues with background downloading.
No longer requests WRITE_EXTERNAL_STORAGE permission if TargetSDK doesn't support non-scoped storage.
Ensured that keyboard dismissed isn't called when the text input is accepted by the Virtual Keyboard's done key or a physical keyboard's enter key.
Additionally, ensured that on dismissal of the virtual keyboard, text entry type is Canceled so that text committal only triggers if the widget is configured with behaviour 'Text commit on Dismiss'.
iOS, tvOS, and iPadOS
New:
IOS: Notification about network path characteristic FIOSPlatformMisc::OnNetworkConnectionCharacteristicsChanged can be used to know about network characteristic changes, e.g. knowing if a new connection is constrained or expensive.
Re-enabled SetBytes and SetBufferOffset on iOS and enable on tvOS.
Added support for Xcode26.
The IOS rotation code now defers applying a new rotation until after we have rendered a new frame in the new orientation, for both auto-rotation and programmatic orientation selection.
This fixes the issue with a squashed aspect ratio when the user rotates the app at a time we cannot immediately render a new frame, such as during loading.
Now ask for background time on iOS until all delegates called from applicationWillEnterBackground are invoked.
Disallowed resolve of R32F MSAA targets as this format isn't MSAA resolvable in Metal.
Additionally, make the texture memoryless as we'll never be resolving to it.
Exposed network changed delegate for iOS.
Implemented functionality for -MetalPSOCache=use.
Bug Fix:
Deferred handling of notifications if the engine isn't ready to receive.
Occlusion Query Helpers now correct the number of frames for Metal mobile platforms.
Ensured valid URL for pipeline cache save location.
The current invalid URL generated was invalid as it was constructing a file URL using the absolute string of another URL as a path parameter to the constructor, causing MTLBinaryArchive->serializeToURL to crash when used.
Now store webauth credentials in iOS keychain using a key that does not change after uninstalls.
Fixed some memory leaks in the iOS web browser.
Rendering
Architecture
New:
Virtual Texture:
Renamed "r.VT.Support16BitPageTable" to "r.VT.PageTableMode".
The setting can now be modified live at run time instead of being read only.
Also removed "r.VT.SplitPhysicalPoolSize" which now corresponds to setting "r.VT.PageTableMode=2".
Unified mip color debug display for Virtual Textures.
"r.VT.RVT.MipColors" is deprecated and Runtime Virtual Textures now respect "R.VT.Borders" which other Virtual Textures already use.
"r.VT.Borders" is no longer on/off. The value now sets the debug border texel width.
Also added "r.VT.Borders.Mip" which isolates the mode to a single mip level.
Release/Recycle Virtual Texture spaces after they are unused for some time.
We don't release immediately to avoid cases during loading where this might trigger unnecessary Recreate/Resize work.
The old behavior was to never Release/Recycle unless we ran out of space slots.
Added "r.VT.SpaceReleaseFrames" to control this. The default is to release after 150 frames. Setting to -1 will return to the old behavior.
Changed draw behavior for selected meshes which only write to Runtime Virtual Texture.
Previously we would fully show those meshes on selection (they are hidden in the main pass otherwise).
Now we only show the selection outline.
Runtime Virtual Texture:
The display name of the "Virtual Texture Builder" (also sometimes previously known as "SVT") asset is now "Streaming Runtime Virtual Texture" (i.e. SRVT). This avoids confusion with Sparse Volume Texture (SVT).
It can now be created from the content browser.
Now prevent StreamingTexture from being carried over when duplicating a RVT component (Save As, copy/paste...). This avoids the common mistake of using another map's SRVT after a Save As.
Added optional Z-increment parameter to FPixelShaderUtils::AddRasterizeToRectsPass, in order to control the Z of the quads (Z = quad index, i.e. instance id * ZIncrement). Combined with depth test enabled, this enables making the rasterization deterministic in case of overlapping quads.
Bug Fix:
Runtime Virtual Texture preload requests now work for the adaptive page table case.
Fixed programmatic RenderDoc captures randomly crashing.
Fixed non DBuffer mesh decals not obeying the mesh component "Receive Decals" setting.
Lighting
New:
Enabled VSM receiver masks for directional lights by default.
~10MB memory overhead (depending on settings/scalability).
Often fairly significant performance improvements in uncached cases with lots of dynamic geometry.
Disabled the selection of Virtual Textures on Rect Light components. These have never been supported in a cooked build, but were still shown in the Editor.
Exposed Max Draw Distance and Max Distance Fade Range to Blueprint.
Now store and propagate "cleared" flags to avoid reclearing pages we never wrote into; particularly relevant for receiver mask where we treat all dynamic pages as uncached but often don't write into them all.
No longer allocate unnecessary receiver mask space if local light receiver masks are disabled.
Refactored VSM ID allocation so that we can control the order more consistently. The immediate goal is to guarantee that directional lights get allocated first so that we can easily allocate receiver masks just for directional lights without the memory overhead of doing it for all local lights as well
Added TexCreate_3DTiling flag to volume textures in TranslucentLighting to reduce memory and boost performance on some platforms.
Marked r.UseClusteredDeferredShading and r.Mobile.UseClusteredDeferredShading as deprecated and added notification about future removal. Clustered deferred shading will be removed in a future release due to lack of utility to reduce maintenance burden.
Bug Fix:
Fixed incorrectly reported one pass projection overflow with megalights active. Only run VSM coarse page marking once when there are multiple views as it is view-independent.
Scale the light fade range by `GLightMaxDrawDistanceScale` to avoid lights becoming too dim at lower scales.
Lumen
New:
Enabled half res integration on High scalability (r.Lumen.ScreenProbeGather.StochasticInterpolation 2).
This can soften normals in indirect lighting, and make GI a bit more noisy.
On the other hand it saves ~0.5ms on console at 1080p, which feels like a right tradeoff for High scalability intended for 60hz on console.
Lumen Screen Probe Gather: Bent Normal Integration improvements (r.Lumen.ScreenProbeGather.ShortRangeAO.ApplyDuringIntegration 1)
Implemented r.Lumen.ScreenProbeGather.ShortRangeAO.ScreenSpace.FoliageOcclusionStrength.
Fixed EvaluateSHIrradiance which was causing brightening in corners.
Removed double AO apply during bent normal integration. Now instead of applying AO for the second time we apply only the GI approximation using AOMultiBounce, as DistantIlluminationRescale was too strong.
Clamp decoded AO as it could be larger than 1 causing too strong indirect specular occlusion.
Now support ShouldApplyDuringIntegration when Screen Probe Gather Integration and Short Range AO downsample factors match.
Fixed artifacts when ShortRangeAO is disabled, but ShouldApplyDuringIntegration is enabled.
Lumen HWRT path now supports split screen.
R.LumenScene.DumpStats 3 will now dump primitive culling information. This is useful, as it merges instances into a single entry making it easier to read the log.
Moved GBuffer tile classification out into a single pass, which is also storing opaque history for the next frame. This pass is reused across Lumen and MegaLights for better performance.
Screen tile marking optimizations, which speed up reflections, GI, and water reflections.
Tweaked default settings:
r.Lumen.TraceMeshSDFs 0 - SWRT detail traces (mesh SDF tracing) is now a deprecated path, which won't be worked on much. For scaling quality beyond SWRT global traces it is recommended to use HWRT path instead.
r.Lumen.ScreenProbeGather.MaxRayIntensity 10 - firefly filtering is now more aggressive by default. This removes some interesting GI features, but also reduces noise, especially from things like small bright emissives
Bug Fix:
Fixed missing subsurface energy by removing extra divide by PI. Now an emissive card matches a rect light reference of the same irradiance. This bug was only affecting Epic scalability (r.Lumen.ScreenProbeGather.IrradianceFormat 0 path).
Fixed a bug on Mac platforms when running on SM5 using R11G11B10 for Typed UAV's causing rendering corruption.
Fix visual artifacts and out of memory reads/writes when using non power of 2 Tracing Octahedron Resolution. Now Tracing Octahedron Resolution is always clamped to valid input values.
Nanite Skeletal Mesh now supports bHasRayTracingRepresentation, so that those primitives can be skipped from Lumen under certain conditions.
Fixed landscape culling stealing the r.Lumen.DiffuseIndirect.Allow's on changed callback. This is not needed anymore since this CVar's callback already invalidates all components, including landscape ones.
Fixed tile artifacts on indirect specular on cloth pixels in the same tiles as hair pixels
Don't reset temporal history on SceneTexturesExtent change. Sometimes SceneTexturesExtent can change due to inline view rendering (like water) which causes full history reset and results in visible noise on screen until things converge again.
Skip creating RGS when Lumen is disabled from the PPV volume.
Materials and Shaders
New:
Added an asset registry tag to find material instances causing shader permutations.
Enabled Virtual Texture sampling on Volume material domains.
Changed the interpretation of the PreSkinned Local Bounds material node when used on Instanced Static Mesh. Previously it was the bounds for the entire component. Now it is the bounds for the mesh instance.
Added platform cached ini value to determine whether to compile 128 bit base pass pixel shader variations on platforms which require them. These are infrequently needed and turning them off can save 50k shaders / 15 MiB at runtime r.128BitBPPSCompilation.Allow (default is true, for backwards compatibility).
Improved error messages reported by shader conductor to properly identify where individual error messages begin and end (and so ensure each compile error is reported on its own).
Disabled the ZoomToFocus behavior when creating a usage node from the declaration - No longer zooms the focus of the editor since this was visually jarring for the user.
Optimized material instance post-load in Editor builds by directly hashing the portions of shadermap ID used to construct the unique asset name, rather than constructing the full string representation then hashing.
Added a Base field to Material Parameter Collections, which can be used to derive one collection from another, with the derived collection inheriting the base's properties.
Added support for overriding a material's parameter collections with derived collections in material instances.
Material scalar parameters can now optionally select an enumeration object to use for selecting scalar values by name in the material UI.
Added default initialization of fields of FMaterialEnumerationEntry.
Added function APIs to MaterialEditingLibrary to manipulate the new Enumeration material parameter.
Reworked ShaderDebugData output to unify the "worker input" and "direct compile" debug mechanisms:
Removed r.ShaderCompiler.DebugDumpWorkerInputs cvar; always dump a valid worker input file for all jobs whenever debug info is enabled.
Moved writing of this file into job completion callbacks alongside the other debug artifacts, so will be written out for cache hits if r.ShaderCompiler.DumpDebugInfoForCacheHits is true.
Modified these files to not include a copy of the compressed source, instead using the .usf artifacts.
Renamed "direct compile" mode to "debug compile" and made it use this file instead of needing to serialize extra data into the debug .usf file.
Removed the r.DumpShaderDebugWorkerCommandLine cvar; all jobs will export a DebugCompileArgs.txt file containing the commandline that can be used to run SCW in debug compile mode by default.
Modified shader pipeline compile jobs to export a single worker input file (in the first stage's debug folder).
Each stage of a pipeline will export their own DebugCompileArgs.txt (for convenience, so if only a single stage fails you can still navigate to that stage's debug folder and run the job from there).
The debug compile for any pipeline stage will run the full pipeline job (so compilation always matches what happens in the normal context) with paths modified to be relative to that specific debug folder for convenience (so when downloading debug output from another machine, only one path in the commandline needs to be fixed up to run)
When using the Material Editing Library of functions, now always refreshes the material instance editor when changing material instance parameters.
This fixes a bug where you would set a MI parameter via a python script and the MI Editor wouldn't update the properties panel to show the newly updated value.
Automatically call UMaterialEditingLibrary::UpdateMaterialInstance() whenever a parameter on a instance is set via the library.
UMaterialEditingLibrary::UpdateMaterialInstance should try to find any open material instance editors and tell them that the material instance has changed.
FMaterialInstanceEditor::NotifyExternalMaterialChange now calls `Refresh()` which will update the whole editor, including the property window, to properly reflect any parameter changes made by the library.
Inconsistency fixed on Comment Bubbles on Material Editor:
To ensure visual consistency new Comment bubbles created use the same color value as the other node editors, like Blueprints.
Material Editor: Added two experimental custom output nodes `Motion Vector World Offset (Per-Pixel)` and `Temporal Responsiveness` to give users a way to modify per pixel motion vectors and set how responsive the temporal history is.
Temporal Responsiveness: Describes how temporal history will be rejected for different velocity mismatch levels.
Default :0
Medium (0,0.5]
Full (0.5, 1.0].
Now, it will be used by TSR to change rejection heuristics. Translucency material can also use it to request higher responsiveness if depth is written (r.Velocity.TemporalResponsiveness.Supported=1) or clipped away (r.Velocity.OutputTranslucentClippedDepth.Supported=1).
The translucency mask generated improves TSR thin geometry quality.
Motion Vector World Offset (Per-Pixel): Works similar to the `Previous Frame` input of `Previous Frame Switch` but in the pixel shader. Regions with invalid velocity will be approximated with the current frame's offset.
This function currently supports non-nanite meshes only in non-basepass velocity write and is implemented in two passes. Use r.Velocity.PixelShaderMotionVectorWorldOffset.Supported to enable it.
Added support for customizing the file name for ShaderSymbols and ShaderTypeStats output files.
Exposed EMaterialProperty::MP_MaterialAttributes to Blueprints, Python, and the Editor UI.
This way users can use the Blueprint MaterialEditingLibrary to connect expressions to the MaterialAttributes output on the material block for materials that use MA.
Added a MaterialEditingLibrary function called RenameMaterialParameterGroup and RenameMaterialFunctionParameterGroup which bulk renames all the Group Names on many Material Parameters at once.
Changed LogMaterialEditingLibrary verbosity to include `Log` messages.
Simply loop over all material expressions that are parameters and if the OldGroupName matches change the name to the new one.
Call RecompileMaterial to force the material to recompile so MIs update through the editor.
Unfortunately the `Group` property of material expressions is spread across many different classes. To avoid checking all the different material expression types (there are 8 different UMaterialExpression classes with their own unique Group), I've opted for a property system approach that looks for the property by name.
Optimize pipeline cache to reduce single allocation size and improve performance by copying less data on resize.
Modified output of shader formats using DXC (DXIL output) to keep the reflection data in the DXIL container if the r.Shaders.ExtraData cvar is enabled. This is a workaround for graphics tools which cannot correctly re-generate reflection information from external PDBs.
Note that this bloats runtime memory usage so should only be enabled locally if you are encountering issues seeing data formats (i.e. cbuffer layouts) in such tools.
Can now copy/paste material errors in the PlatformStats panel.
Simply makes the text read-only "editable" so the user can select the text and get automatic copy/paste functionality.
Rename the aliases for the Convert node from `Make Float4` to `Make Vector4` to match "Vector Parameter" and "Constant Vectors'.
This also avoids confusion with the existing Make Float 4 Engine Material functions.
Added additional project-specific texture groups.
Vector Parameter Expression now shows output pin display names to avoid confusion on what the first output pin is.
Also fixed "Convert to Constant" for vector parameters. By default the outputs are now:
RGB
R
G
B
RGBA
Users were expecting the first output pin to be RGBA, but it was RGB.
Now shows output name on pins by default for vector parameter.
Added RGBA output as the final one to match what TextureSample does.
Updated this behavior in the new material translator (it should really use the outputs array which is already defined).
If no channel names are specified show R, G, B by default.
No longer truncates and loses user data when using "Convert to Constant" for Vector Parameter -> Constant.
Gave constant 4 expression display names so the conversion code can match outputs by name when converting nodes.
Marked deprecated virtual functions from MaterialInterface and FMaterial as final to avoid silent errors.
Modified all derived classes to override the right functions.
Improved IO performance of FinishPopulateShaderLibrary.
Added a new debug artifact (ShaderTypeStats.csv), dumped by default for all cooks to the ShaderDebugInfo folder for each shader format.
This CSV file contains permutation counts/code sizes for all shaders in the shader library, grouped by shader type.
Note that this is not directly representative of final shader memory usage since it doesn't account for potential duplication of bytecode introduced by the pak chunking step (where shaders used in multiple pakfiles will have a copy in each).
This is only intended to be used as a tool for tracking and comparing shader growth over time or between cooks.
Subsurface Profile: Improved neighborhood validation for checkerboard when enabled, less bleeding into subsurface scattering region for low res.
Bug Fix:
Virtual Texture Pending Mips debug view now takes screen scaling into account.
Fixed UMaterialExpressionParticleSubUV::Compile bug that caused the node not to use the texture object connected to the Texture input pin.
Repaired cook editor-only-data nondeterminancy in materials.
Ensured that FDefaultMaterialInstance's CacheUniformExpression is cancelled on destroy if still pending.
Under certain conditions the FDefaultMaterialInstance could be destroyed and subsequent dispatch of CacheUniformExpression would result in a crash due to a dangling reference. This replicates functionality from FMaterialInstanceResource for which this guard is already implemented.
Fixed a potential out-of-bounds read when remapping shader compile diagnostic messages; could occur if there were no digits before the end of the line in the diagnostic message after the __UE_FILENAME_SENTINEL marker.
Fixed material shader map not releasing compilation ID if shaders failed to compile.
Fixed incorrect reporting of line numbers when compile errors are encountered in generated material code.
The code calculating the line number offset of the substituted #line directive in MaterialTemplate.ush was incorrect.
Fixed a bug that could cause a retry loop when running with shader development mode enabled and a preprocessing failure is encountered.
Fixed crash in SafeRenameEditorOnlyData() when EditorOnlyCurrent is null.
Fixed a material derivative autogen crash when dealing with uints.
Fixed a crash occurring when the material parent of an instance is changed through scripting.
Fixed ShadingModel material expression in-node combobox to display only valid shading model entries.
Made a minor fix for custom ShaderTypeStats customized name, needs to lookup cvar by ShaderFormat.
Added support for Nanite Geometry Collections to Preskinned Local Bounds material node.
Fixed an issue where the Vulkan shader pipeline cache would sometimes incorrectly produce cache misses for shaders that had already been compiled and serialized.
Fixed shader output for preview/transient materials being cached in DDC.
Changed UMaterialFunctionInterface to include the BlueprintType annotation.
Removed incorrect application of the component scale to the output of World Space Vertex Normal node when used with skinned mesh.
Fixed an uncommon crash in Lerp material expression when the alpha pin was connected to a non-primitive output.
MegaLights
New:
Implemented MegaLights-driven VSM marking to only mark VSM pages that MegaLights has selected samples for.
Added the r.MegaLights.DownsampleCheckerboard, which can run sampling/tracing at half res (every other pixel). It's a good middle ground between default quarter res sampling and option full resolution sampling.
Exposed r.MegaLights.HardwareRayTracing.ForceTwoSided, which allows to flip between matching raster behavior and forcing two-sided on all geometries in order to speedup tracing.
Now always vectorize shading samples. This saves on average 0.1-0.2ms in complex content on current gen consoles.
Improved spatial denoiser filtering after disocclusion.
Limited number of samples sent towards the directional lights to a specified fraction (r.MegaLights.DirectionalLightSampleFraction). This helps with noise indoors, where there's a strong directional light inside taking over the entire sampling budget.
Now uses downsampled neighborhood for temporal accumulation. Interpolated pixels don't add much to neighborhood stats, so we can skip them, improving quality by effectively using a wider neighborhood filter. This also improves performance of the temporal accumulation pass, as it now can load less data into LDS.
Now properly handle invalid sample upsampling. Sometimes during upsampling we can't find any valid sample and need to fallback to history (without any neighborhood clamp). This makes lighting on highly detailed or thin geometry a bit sharper and a bit more stable.
Disabled guiding tile filtering and added stochastic bilinear sampling of guiding tiles in order to hide tile artifacts.
Now merge identical rays in order to avoid overhead of duplicated traces. Duplicated rays happen with strong point lights, where we may send a few identical rays to the same light doing unnecessary work.
Added screen space trace for hair (r.MegaLights.Hair.ScreenTraces). Screen space traces improve card hair quality compared to approximate RT fallback mesh, but can be noisy. In order to reduce the noise there's now extra hair only screen space trace bias (r.MegaLights.Hair.ScreenTraces.Bias).
Merged downsample factor / checkboard CVars into a single r.MegaLights.DownsampleMode CVar.
Bug Fix:
Now require ray tracing platform support, in order to skip compiling and cooking MegaLights shaders on certain platforms.
Fixed split screen crash due to out of bounds memory reads.
Fixed denoiser artifacts on borders between dielectrics and metals (bright outlines) caused by too aggressive material demodulation factors.
Nanite
New:
The dithered opacity mask option is now supported for Nanite rasterization.
Added a new culling check that can improve Nanite culling speed and reduce the amount of memory needed for candidate clusters (r.Nanite.Culling.MinLOD).
Added support for rendering Nanite skinned meshes in the animation editor.
Exposed NanitePixelProgrammableDistance for Nanite skinned meshes to enable forcibly disabling pixel programmable rasterization of Nanite when the mesh is further than a given distance from the camera.
Added experimental and optional passes to prime the HZB before VisBuffer rendering if the HZB is missing (e.g., due to a camera cut), see cvar r.Nanite.PrimeHZB et al.
The main idea is to draw a lower resolution (HZB or lower) and lower detail (by using LOD bias and/or drawing only ray tracing far field scene geometry).
This new render is then used to build a HZB with some depth bias that is then used to render the full scene, greatly improving the cost in many cases.
GeometryCollection: Added a "Nanite Minimum Residency" setting for Geometry Collection assets. This controls the number of resident nanite root pages.
Previously we used a single root page and this is still the default.
Increasing the value can avoid pop-in when a Geometry Collection is first shown.
Added support for disabling "Render In Main Pass" on static mesh components for Nanite meshes.
Bug Fix:
Fixed a bug where the World Position node would return incorrect results when used to calculate opacity in a masked material.
Automatically disable Software VRS when Nanite is not enabled, preventing it from generating shading rate images which will not be used.
Fixed a rare streamer crash that could occur when a streaming page is resident in the streaming pool while its root page slot gets reused a multiple of 256 times.
Invalid page requests from the GPU are now ignored and optionally logged, instead of potentially resulting in a crash.
Suppressed console warning spam when `r.Nanite.Visualize` is set to an invalid value.
Fixed an incorrect conservative instance draw distance test used in the hierarchical instance culling that caused missing instances.
Nanite: Fixed incorrect geometric normal when using r.RayTracing.Nanite.Mode=1.
Fixed a GPU crash that could occur when Nanite was rendering to odd viewport sizes.
Fixed a crash in Nanite primitive filtering that can happen if HLOD force-hidden primitives, or the view's ShowOnlyPrimitives/HiddenPrimitives, contain invalid primitive IDs when there are no primitives in GPU scene.
Fixed a regression where if a static mesh has multiple mesh sections of the same material, Nanite build would merge them into a single mesh section, which could cause them to be re-ordered and cause issues. Now the multiple mesh sections remain intact, but the fallback will not have triangles in the duplicated sections.
Fixed an issue where the sign of the TwoSidedSign node would be flipped for masked materials.
Fixed a crash caused by enabling a Nanite visualization mode when instanced stereo rendering is enabled.
Fixed an issue where MaxHierarchyDepth was not calculated correctly, which could under rare circumstances result in streaming not progressing beyond a certain point.
Fixed an issue where having a non-Nanite capture in the scene can cause the Nanite streamer to not get updated and result in GPU hangs.
Fixed an issue where scene captures and main view rendering would independently try to update residency, sometimes resulting in visual artifacts.
Niagara
New:
CascadeToNiagaraConverter: Can now add template emitters.
Supported read / write icons for stateless: You can now more easily see where bindings are used in LW emitters.
Added a way to release resources from render target 2D:
Changed handling of null texture to set the material default to avoid dangling references.
Removed slate dependency from emitter merging (used by python scripts), which could trip up commandlets that ran without the editor UI.
Other distribution types can now opt into indexing / address / interpolation.
Initialize particle add lookup value mode options:
Added initial look up value mode enum.
Enabled lookup on initial position.
Changed color to a distribution.
Added getter method for Niagara parameters.
Lazy instantiate parts of the baker to reduce memory usage: Added a call to tick the baker world as paused, this ensures the world manager is called to process clean up functions.
Arrays for LW distributions:
Made a large refactor to make reading a distribution a function call vs a structure.
When sampling a value needed for motion vectors pass in multiple time parameters and it will return both values to ensure random is respected.
Some limited space was added to pack indexing into the data, this can be controlled using meta data on the distribution property.
GPU storage moved to ByteAddressBuffer for LoadX operations which gave a small speed boost.
Perf on a large number of particles was marginally better vs before.
LWE:
Added support for debug HUD particle attribute display.
Added support to data set readback.
Adjusted display name for SKM / SM DIs to remove confusion between the asset types.
Changed pin color based on Data Interface vs UObject to reduce confusion.
LWE Shape Location Changes:
Added shape scale.
Fixed plane shape not applying rotation.
Added surface mode to the cylinder.
Material Parameter Collection Data Interface: You can now push scalar / vector parameters from Niagara to MPCs.
Removed UNiagaraEmitter from stateless emitter on cook.
The cooked build does not require them, various parts of the UI still make assumptions and will be cleaned up.
This saves ~4k per stateless emitter.
Added rotator distribution to stateless & use in shape location to allow the rotation to be bound to an attribute.
Fixed the axis not properly being used on the display name for each widget.
Fixed the same binding being added multiple times.
Niagara Editor Preview Actor:
Used for previewing and tuning Niagara Systems without the need to run PIE.
Has some simple default motion options which can be overridden by a derived Blueprint for more complex behavior.
Niagara Fluids: Added vector controls for turbulence frequency and gain.
Niagara Content: Added distribution curve dynamic inputs for float, vector, and vector2D types.
Weighted Distribution Int Array:
Each entry has a value & weight.
The Weight is used in the random calculation, so the higher the weight the more likely it is to return that value.
CascadeToNiagaraConverter: Added UPROPERTY() tags.
When changing the preview platform, now invalidate the cooked status.
We need to make sure everything is in sync when the device profile changes to avoid crashes inside the VM.
Added Niagara to Visuals placement menu.
Updated Stateless Rotate Around Point module:
Added coordinate space / rotation / center.
Added a CPU path for the module.
Added Debug Draw support.
Added a property to customize quick capture number of frames.
Added ID support to Sim Cache Reader.
Added wildcard name match exclusions to sim cache compare.
Validation rules can now be disabled by config file.
Added information about who is using sorting.
Added a marker to sort key generation.
Added a console variable fx.Niagara.Batcher.DumpSortedSimulations which can be used to dump to the log.
Changed the color grad editor stop time widget to use the spin box.
This allows for math operations and validation of the input data.
Dynamic Mesh Sim Cache Storage + Visualizer.
Added all base Niagara float types to sim cache interpolation.
Enabled by default can be disabled by changing bInterpolateAllTypes in the creation parameters.
This improves MRQ renders with temporal samples.
Added concurrent sim cache reading when no data interfaces are cached.
Can be disabled using "fx.Niagara.SystemSimulation.AllowASyncSimCache".
Enabled concurrent execution for fixed DT systems if it's a single tick.
Fixed a bug in the component recaching where it ran all the time in the editor.
Stateless Curve Editor Improvements:
Moved the existing LW curve editor into the compact curve editor.
Added a new curve editor for distributions which is closer to the existing curve editor.
Exposed some of the common widgets shared between the editors.
Future change will be to wrap the DI inside the distribution adapter and share the editors, which will be useful for the compact editor also
Made the FXSystemInterface sharable to fix world tear down reference issues.
In some situations an FX component can be destroyed after the world.
When the world is destroyed it will destroy the FX system set, which will enqueue a command to destroy the FX interfaces.
The render command can execute before the FX component's are destroyed leaving them with a dangling reference.
Added a setting to enable HLSL 2021 in Niagara.
HLSL 2021 features will fail to compile on the VM and on some platforms, but this allows users to experiment.
Added an enum for notify progress, none / forward / reverse.
Fixes issues around using negative rate scaling and allows the user to still use 0-1 when playing backwards.
Disable Source Mode with LWE to reduce confusion.
We don't have a particle stack so there is no way to modify the data without binding to system / user parameters.
Added console commands (fx.Niagara.Component.ReinitializeActive & fx.Niagara.Component.DeactivateActive) to allow a quick way to kill / restart Niagara components.
Cleaned up various console variables while I was here.
Niagara: Properties (Section Start Behavior, Section Evaluate Behavior, Section End Behavior, Age Update Mode, Allow Scalability) in UMovieSceneNiagaraSystemSpawnSection can now be set in Blueprints / Python.
Multiply the debug draw color by alpha so we can have translucent lines.
Now send the current bounds to the GPU for the emitter properties DI.
This makes the result of GetBounds consistent between both paths when using fixed bounds on the emitter.
Removed stateless emitters from compilation.
Previously they would still generate some HLSL data resulting in compilation when added / removed.
Cleaned up several areas that assumed Emitter Data would always be valid.
Made renderer memory savings by reducing FNiagaraVariableAttributeBinding.
Sprites 1992 -> 1320 = 672
Mesh 1688 -> 1160 = 528
Ribbon 1888 -> 1312 = 576
Light 800 -> 560 = 240
Added a rule for validating material usage in renderers.
This makes it possible to block content that does not have the appropriate usage flags set.
Niagara Content:
Added a new dynamic input to support querying values from the new Weighted Distribution Int Array data interface.
Added new modules for spawning particles from simulation caches.
Removed all the async optimize / decompression of VM byte code.
The new VM does not use this path so the code is dead.
Enabled Sub UV cutouts ES3.1.
Can now use the Niagara Data Interface to set material parameters on Material Instance Dynamic objects, from a CPU stage.
CascadeToNiagaraConverter: Add more script input types.
Added Shift+D to enable selected emitters (reverse of D which disables selected emitters).
Refactored renderer widgets to share code and use small chip
Added a menu entry when we have no stateless bindings to make it clear to the user what type we are looking for.
Added a debug draw to renderers.
Implemented debug draw for light & decal renderer.
Added column sorting to sim cache viewer.
Also cleaned up how we build the table data to make it less confusing.
Bug Fix:
Fixed issue where ParticleSystem EPSUM_FixedTime had no effect due to incorrect assignment.
Fixed validation accidentally changing usage with flags on materials.
CheckMaterialUsage will both check and set which can result in a race with shader compilation.
Use the component transform for local space vs the simulation one - When disabling requires current frame data (for performance) these could be out of sync, which mismatches other renderers on the RT (i.e. sprites & meshes)
Fixed hash function in data channel to use full string data instead of just half of it.
LWE: Set the sim target on the compiled data set to match the mode.
This fixes a mismatch that can cause attributes to not upload to the GPU when we are in CPU mode due to using the light / decal renderer.
No longer call the OnSystemFinished delegate if we are constructing Blueprints.
The delegate might interfere with the actor / components and can cause crashes.
Shader loading: Now prevent dereferencing potential nullptr when file is not found.
Fixed emitter renderer tick ordering issue when combined with LWE.
Added missing postload calls for stateless emitters.
Guarded against using EmitterData as it can be nullptr.
Fixed binding buffer changes causing dispatches to serialize on some RHIs.
Fixed potential OOB reads if a binding is invalid.
Added a lock to GPU Sort Manager AddTask to ensure no concurrent access.
This fixes a race between Niagara & Cascade adding tasks.
Now calculate spawn probability per particle for spawn rate, rather than per loop.
Fixed user variables being removed and renderers not updating correctly.
The variable was without namespace so failed to match.
Added a missing null check for the graph source that can happen during undo.
Fixed GetResourceSizeEx miscalculating for non-isotropic UTextureRenderTargetVolume.
Niagara component renderer: now only register one object replacement delegate with the CDO to prevent races during asset loading.
Added missing CanBind to user parameters.
Changed style of binding to be more consistent with other bindings.
Now sets the world time information in the baker.
This fixes things like Engine.Time always being 0.0 and material based time effects not working as expected.
Used GroupMemoryBarrierWithGroupSync with Radix Sort to fix issues on various GPUs.
No longer load niagara system when getting asset registry tags, to prevent deadlocks during emitter merging.
Disabled low latency when anything other than the lit view mode is active.
Some of the view modes short circuit rendering so the data may not be ready in time.
Fixed a crash when copying script variable metadata.
Handled null data interface inside Niagara Variant.
It is unclear how the variant DI becomes nullptr at the moment, this will at least avoid crashing the editor, but more investigation is required to understand why.
Fixed duplicating an emitter with RunUpdateScript set for interpolation mode changing post duplication to NoInterpolation.
Fixed single segment GPU ribbon UV calculations being incorrect.
Fixed a potential use-after-free on world tear down.
If the compute interface is marked pending kill we can ignore sending the command to remove from the computer interface as it will be killed before.
Fixed an asan issue using the component in the lambda.
Bring changes over for garbage references also.
Fixed incorrect stride with FRibbonAccumulationValues when using different features.
Fixed color curves not working inside NPCs when using GPU emitters.
When modifying parameters in the detail panel, now use the editor setting GetResetSimulationOnParameterChange to see if we should reset the system or not.
Disabling reset can be useful to iterate on content live.
Fixed editor undo crashing due to order being out of sync and the thumbnails.
Fixed update context killing systems that are waiting for compilation.
When switching preview modes the update context is called multiple times.
The first time it's considered active.
The next time it's no longer active but is waiting for compilation (compontent ticking) so is now removed from the reactivate list.
We now check if the component tick is enabled due to waiting for compilation results.
When setting up previous data use current if previous does not exist.
Current changing to a new position binding which does not have a previous value generated it would use the default position which is 0,0,0. Using the current value won't produce corrupt motion vectors, but will also not produce correct motion vectors.
Changed default for LOD size Y to -1 to fix issue with meshes being culled incorrectly.
A value of -1 indicates that it will never be culled by screen size.
The previous value of 2 would be adjusted to 1.0 and fail the >= screen size test if bounds were large enough.
Now uses the aliased variable when finding the default mode
This fixes an issue if the first time a variable was encountered it was in StackContext as we would ignore the binding.
Fixed a bug where min instead of max distance was used as LoD parameter.
Fixed a nullptr and weak ptr bug in error log format.
Fixed a bug when an error during script merge occurs.
Fixed memory leak in data channel object destructor.
Path Tracer
New:
Improved the adaptive sampling heuristic.
Added an option to hide the planet ground surface.
When using reference atmosphere mode, the path tracer no longer displays a large ground sphere to represent the planet for better parity with the deferred renderer.
The old behavior of showing the planet ground can be accessed by the cvar r.PathTracing.EnableAtmosphereGround.
Post-process materials can now be specialized for the path tracer.
This adds a permutation of the PostProcess Material that is used when the path tracer is enabled on the view.
This can be used to account for differences in how the path tracer creates the image. Behavior can be customized with the PathTracingQualitySwitch node.
Bug Fix:
Improved shadow artifacts in transparent shadows due to double-counting of transparent hits.
Improved startup time by moving rarely used permutations to experimental.
Fixed a crash when enabling decal normal projection.
Postprocessing
New:
Changed the EOTF for UI composition in HDR from sRGB to BT.1886 for improved parity between SDR and HDR appearance. A new CVar r.HDR.UI.CompositeEOTF was added to provide control over this behavior.
TSR:
Added an option to allow all shading models to use TSR thin geometry detection when r.TSR.ThinGeometryDetection.Coverage.ShadingRange=2.
Added exposure offset (r.TSR.ShadingRejection.ExposureOffset) back so global darkening ghosting can be improved. The value behaves a little differently and is now used to adjust the exposure offset for the reject shading moire luma and guide history. Any legacy project before UE5.5 using the old CVar should consider adjusting the value.
Updated shader selection logic for CombineLUTs to force compute shader rather than pixel shader if graphics volume rendering is guaranteed, and reduced the size of the dispatch group from 512 threads to 64 threads.
Bug Fix:
Replaced usage of PF_R32G32B32F with PF_R32_FLOAT for the ACES gamut table texture to make the implementation compatible with more platforms.
Fixed alpha invert show flag on desktop if primary upscale was active.
Fixed Bloom not working with TSR when motion blur is disabled.
Forced the invalidation of the low-res scenecolor for translucency after motion blur pass if motion blur is not run.
RHI
New:
AddEnqueueCopyPass can now be used with texture arrays.
Metal:
Refactored bindless to support new FeatureLevel & Platforms and include a per-project experimental Mac option to enable SM5 Bindless.
Upgraded Metal Developer Tools from 4.4 to 5.3
MetalCPP: Upgraded to metal-cpp_macOS15.2_iOS18.2
Bug Fix:
Fixed a bug in the PS4 renderer submission queue that delayed signaling occlusion query events.
Fixed UpdateTexture2D() failure case where the source region has an offset and the texture is block compressed.
Substrate
New:
Improved the rough diffuse shading model to minimize energy loss and improve the shaping at high roughness.
Improved legacy conversion of cloth materials.
The roughness range of cloth has been adjusted for better parity with the legacy cloth BRDF.
The specular amount is now automatically adjusted to account for the Fuzz layer being added on top of specular in Substrate whereas it was linearly blended in the legacy model.
Removed r.SubstrateBackCompatibility as we now rely on the Substrate Rough Diffuse option to drive that instead.
Set Blendable GBuffer format as default for new projects. Some archvis and automotive project templates are set to Adaptive GBuffer format by default.
Bug Fix:
Fixed most material properties not being added to FMaterialData::PropertySizes when baking Substrate materials on the Actor Merge -> Simplify path.
Simulation
Chaos Visual Debugger
New:
Improved batching of TEDS operations performed when new physics body data is loaded in the scene. This change, combined with some other improvements made in TEDS itself, resulted in ~75% reduction in the processing time when the first frame of a large CVD recording (+90.000 objects) is loaded. The stall in this particular case went down from ~12 seconds to ~3 seconds.
Added support to enable CVD recordings in Shipping configurations.
Added a new pop up notification to provide a cleared indication of when CVD is still processing trace data for a loaded file.
Added a non-blocking loading bar. This bar will appear in the status bar to indicate the loading process of very large CVD files.
Added initial experimental support for tracing smaller sections of a map instead of the entire map.
This can be configured from code with the CVD_SET_RELEVANCY_VOLUME macro or via Blueprint with the CVD Set Trace Relevancy Volume node.
Note: If a recorded body moves to outside the recorded volume, CVD will show that body frozen in time. This will be addressed in the next release.
Implemented the new view port toolbar the rest of the editor uses.
Extension System:
Added support for attaching custom data to the CVD Recording instance.
Added support for implementing 2D visualizations via CVD's component visualizer API
Improved tracing performance by removing the need for locks (and reduced the contention of ones we could not remove) in some heavily multi threaded paths. Mostly in collision geometry and physics body metadata serialization paths.
Removed connection details from the Recording status message, and moved it to its own message which is sent when needed. This reduces the message bus bandwidth usage when a CVD recording is active.
Bug Fix:
Added missing serialization for FChaosVDParticleDynamicMisc::MLinearEtherDrag.
Added missing serialization for FChaosVDParticleDynamicMisc::MSleepThresholdMultiplier
Added missing serialization for FChaosVDParticleDynamicMisc::MCollisionConstraintFlag.
Fixed an issue where attempting to trace multiple processes at the same time could fail to playback, even if the recording was successfully started.
Fixed a race condition when a CVD recording is started at the same time or right before PIE is started, resulting in a crash.
Fixed an issue where CVD's sessions manager broadcasts a session discovery ping every second, even if CVD is not open in the editor.
Fixed incorrect visualization of per particle position/velocity/projection iteration counts.
Moved iteration counts to FChaosVDParticleDynamicsMisc and added serialization version guards accordingly.
Fixed an issue where trying to load the same CVD recording twice caused an ensure, and failed.
Fixed an issue where the first frame of a recording was not automatically loaded in some scenarios, resulting in an empty scene until you scrubbed to a new frame or started playback.
Fixed an edge case where the recording controls UI could get soft locked, blocking you from stopping a recording that was just started.
Fixed an issue where QueryData was used instead of SimData, in the details customization used for Collision Geometry details panels.
Fixed an error where the Network Tick sync mode was not clamping the track tick offsets to the supported limits in some scenarios.
Fixed an issue where recorded destroyed particles were not being properly removed from the scene.
Fixed a crash that could happen if you play a CVD recording while it is still loading.
Cloth
New:
Added a ReferenceSpace local damping option to Chaos Cloth. This enables local damping about the reference space bone instead of the existing center of mass option.
Updated ChaosClothAsset and ChaosOutFitAsset to use SoftObjectPaths internally to better handle renamed dependent assets such as the Physics Asset.
Updated Chaos Cloth to internally use FNames instead of FStrings for properties. This fixes a long-standing performance regression when setting simulation properties at runtime via the cloth blueprint interactor.
Added the ability to specify the ReferenceBone for a cloth asset.
Added additional accessory meshes for chaos cloth.
Updated the backstop constraint to be able to use this accessory mesh.
This feature is considered experimental.
Cloth Remesh Node: Can now transfer vertex weight layers to output cloth render mesh.
Updated Chaos Cloth and Skeletal Mesh-based cloth to better handle non-simulating LODs.
Fixed a bug where chaos cloth could stop simulating if there was a non-simulating LOD sandwiched between two simulating LODs.
Updated Skeletal Mesh-based cloth to no longer tick cloth for non-simulating LODs when cloth is present on other LODs.
Chaos cloth debug draw improvements: Added wind velocity and updated gravity display.
Bug Fix:
Fixed an editor crash which could occur when remeshing a chaos cloth asset with Long Range Constraints.
Fixed issues with Kinematic Collider and Skinned Triangle Mesh, these were regressions from implementing Skinned Triangle Meshes in Chaos Cloth in the last release.
Kinematic Collider was using previous frame's positions for its constraint Apply causing it to lag behind and not fully resolve collisions.
Kinematic Collider debug draw was broken due to an indexing bug.
Added ClothCollisionThickness parameter on the SimulationCollisionConfigNode was not setting the correct string, so it wasn't being used.
This fix for this will not affect existing assets (ClothCollisionThickness will be set back to 0 to retain existing behavior).
Cloth Render Node: Now populate all UV Channels for output.
Fixed CorrespondClothAssetIndex never set in BindToSkeletalMesh, since checks are stripped out in Shipping.
Cloth Remesh Node: use the DynamicMesh UV layers to determine how many UV channels should be on each render vertex in the output ClothCollection (so that we don't accidentally add 4 channels when the input only has 1, for example).
Core Physics
New:
Partial Island Sleep:
Added a console command to enable partial island waking when the user explicitly manipulates the transform of a rigid body ("p.Chaos.Solver.Sleep.PartialIslandSleep.PartialWakePreIntegration").
Added a console command to enable rigid body waking based on the velocity change introduced by the velocity collision solver ("p.Chaos.Solver.Sleep.PartialIslandSleep.PostStepWakeThreshold").
Added a console command to restrict partial island sleep to collision constraints only, i.e. rigid bodies connected by other constraint types will have to be both awake or asleep ("p.Chaos.Solver.Sleep.PartialIslandSleep.CollisionConstraintsOnly").
Added console command to enable the propagation of impact momentum though the physics constraints to determine with the purpose of waking rigid bodies in partially sleeping islands ("p.Chaos.Solver.Sleep.PartialIslandSleep.MomentumPropagation").
Introduced a Blueprint event to enable or disable partial island sleep for the entire island a rigid body is in ("Set Allow Partial Island Sleep").
Improved performance by limiting partial island waking to scenarios with any sleeping rigid bodies.
Added a console command to only enable partial island sleep if the decimal percentage of motionless rigid bodies is above a user-defined threshold ("p.Chaos.Solver.Sleep.PartialIslandSleep.MinimumMotionlessRatio").
Added generic AddElem function for AggGeom and helpers to access the correct containers based on input element type.
Added SetUseMinTimestep function in Immediate Physics API.
This makes it possible to avoid switching to a fixed timestep when the delta time is small, bypassing the cvar p.Chaos.ImmPhys.MinStepTime
Added a new p.Chaos.MinParallelTaskSize cvar and CVarMinParallelTaskSize function to set a threshold of tasks to run in parallel, which can improve performance on low-core platforms.
Enabled some p.Chaos cvars (like p.Chaos.MaxNumWorkers) in Shipping so they can be used to tweak game-specific performance.
Enable some physics cvars (like p.Chaos.MaxNumWorkers) in Shipping so they can be used to tweak game-specific performance.
Added support for setting CollisionEnabled per ISM body.
Exposed functions for calculating covariance matrix of a set of points and retrieving the dominant eigenvector.
Added a per poly collision setter function to SkeletalMeshComponent.
Moved several shapes from Chaos to ChaosCore.
Added an option to treat default as simulated for RBAN.
Bug Fix:
Enforced drive linear force limits when non-linear joint solve is enabled.
Fixed SphereTraceComponent not returning the hit FaceIndex when tracing against complex shapes.
Fixed an issue where AddForce related methods did not generate wake events in some scenarios.
Now detect and remove null constraints from CCD swept constraints prior to application.
Fixed collision behavior when converting from probe to nonprobe.
Optimized allocation in cable mesh building
Chaos: Fixed wrong rotation axis when using simd for linear joint solver.
Fixed an occasional crash when unwelding rigid bodies.
Fixed a physics bug where unwelding via socket name failed to unweld. This could lead to a crash when the parent body was destroyed and a query was performed against the child.
Fixed FKShapeElem copy constructor accidentally changing the CollisionEnabled flag instead of copying it.
Dataflow
New:
Double clicking on a Dataflow variable now finds the related nodes in the Dataflow graph and sub-graphs.
Dataflow construction views are now generally more performant for large meshes and allow render data caching.
Added transform support to dataflow rendering geometry groups.
Added capsule rendering support to the rendering facade.
Updated the weight map tool in dataflow to more closely match the UI of existing painting tools.
Dynamic mesh processor blueprint can now optionally specify that it is ok to run async.
It is now possible to edit some of the bool / int / float non-connected input parameters inline on Dataflow nodes.
Added a 'Cut Planes' array input to the PlaneCutter dataflow node, to support directly specifying the cutting plane(s).
The Geometry Script based Dataflow node now exposes the Geometry script parameters out to the Dataflow node as connectable inputs.
Added general array Dataflow nodes for getting an element or reading the size of an array.
Dataflow can now automatically add a node to auto convert from an output type to an input type.
Added an option for dataflow FilterPointsWithMesh node to filter by mesh min/max distances in addition to inside/outside winding number test.
Added a general dataflow selection -> index array conversion node (so that e.g. one can iterate the selected indices).
Added support for root proxies for Dataflow based Geometry Collection asset.
Enabled construction view rendering for most of the geometry collection Dataflow nodes.
Added a generic version of the math Clamp dataflow node.
Dataflow variable nodes can now be used directly in Subgraphs.
Added the possibility to promote a dataflow input to a variable ( right click menu ).
Geometry Script based dataflow nodes will now open the Geometry Script blueprint when double clicked on.
Dataflow now show an array pin icon for array types.
Added a Dataflow node to set a string transform attribute and to select from a string pattern.
Added dataflow nodes for conversion from an index or index array to a dataflow selection.
Support "Only Same Parent" option for TinyGeo "Merge Geometry" mode (and corresponding dataflow node).
Added Dataflow nodes for getting bounds from static mesh and dynamic meshes.
Added support for setting up root proxies in Dataflow.
Added a Dataflow node to set the dynamic state of geometry collection bones.
Updated the Dataflow Editor to better handle Save As by reconnecting the newly created derived assets (e.g., Dataflow Asset) to the main asset.
Added display of performance data for Dataflow subgraphs.
Optimized the Dataflow collection spreadsheet ( up to 25x for large collections ).
Added Box, Capsule and Convex simple builders as geometry generators for dataflow physics assets.
Added support for manipulating bones from the Dataflow Edit Skin Weight tool.
Added Fov and planes options to the view menu in both Dataflow simulation and construction views.
Bug Fix:
Fixed crashes due to incorrect selection init for some dataflow fracture nodes.
Expanded out fracture brick pattern bounds by a half-brick, to fix bricks not quite covering the intended bounds in many cases.
Made the collection->mesh dataflow node take an optional selection and perform the conversion more consistently with the collection selection->meshes dataflow node.
Changed the dataflow 'show/hide inputs' menu to use the localized display names instead of the internal source code names.
Add correct struct handling to dataflow context cache to support nested UObject references.
Made blueprint dataflow nodes default to evaluate on the game thread, for safety.
Added guards against selecting invalid indices. Now returns false instead of crashing on attempting to set an invalid selection.
Fixed Dataflow graph not re-evaluating when switching from manual to automatic evaluation mode.
Made sure Dataflow nodes performance data is recorded per node even when the data is not shown on screen.
Fixed the Dataflow Selection by Level Node to make sure the level attribute exists in the collection.
Fixed "append collections" dataflow node not updating transform indices correctly.
Fixed array support for Dataflow subgraph inputs and outputs.
Fluids / Smoke
New:
Added default drag for accurate integration.
Added support for landscape proxies.
Drag model updated buoyancy tests make sure physics assets for rafts computes mass with the correct material.
Added water, spray, foam shading improvements, translucent spray particles
Refactored capture modules in sw emitters to handle overhangs in terrain with better controls rework summary views.
Bug Fix:
Fixed spike artifacts by only advecting to wet cells. This can avoid issues where we advect into steep areas that we shouldn't be.
General Physics
New:
Added a way to reset the state of a geometry collection (from Blueprint or live from the editor with a button in the component details).
Added the ability to incrementally create new cache collection assets each time a Chaos cache records.
Exposed Chaos cache observed component functions to Blueprints.
Geometry collections can now be converted to Skeletal meshes (right click on the asset or in Dataflow).
Added a way to start and stop a Chaos Cache from Blueprint.
Added API for generic sweep traces (Sphere, Boxt, Capsule and Raycast) on the physics thread.
It is now possible to query a geometry collection leaf bone using a line trace from Blueprints (FindLeafTransformByLineTrace).
Added asset user data support to physics assets.
Added support for override materials for geometry collection root proxies.
Bug Fix:
Creating a Chaos cache from the main menu can now be undone.
Fixed Chaos cache not recording events properly after the cache was recorded once.
Fixed Chaos cache not properly replaying simulations of geometry collection using root proxies.
Geometry collections with no materials are now assigned a default material. This prevents issues where the geometry collection may have weird rendering artefacts.
Fixed spawned geometry collections not properly using the physical material set on the asset.
Fixed a crash in the geometry collection SetLocalRestTransforms method happening when the rest of the collection is empty.
Fixed Chaos Niagara interface not playing trailing events properly.
Fixed Nanite based geometry collection not replaying properly from a Chaos cache.
Fixed geometry collections not properly waking up when applying velocity.
Fixed force based local fields not working properly when applied to a geometry collection.
Made sure gravity settings are propagated to cluster unions or cluster group unions.
Fixed geometry collection anchored and other attributes being stripped when using strip on cook on Nanite based geometry collection.
Fixed Chaos cache not properly restoring Simulate Physics or notify break flags when deleted or when removing an observed component.
Fixed geometry collection local field not properly working with partial clusters when using minimal resolution.
Fixed an issue with geometry collection Nanite fallbacks not rendering when enabled and when Nanite is disabled in editor.
Modular Vehicles
New:
Added an additional input quantization mechanism.
Networked Physics
New:
Made improvements to how and when RewindData caches physics states along with fixes for KinematicTarget resimulation.
Optimized NetworkPhysicsSettings memory footprint from padding and alignment.
Added a NetworkPhysicsSettingsDataAsset and converted the NetworkPhysicsSettingsComponent to reference the DataAsset instead of holding all settings in memory for each actor instance.
Added the first iteration of Iris support in the NetworkPhysicsComponent with a new base struct for inputs and states along with a new interface for custom implementations to communicate with the NetworkPhysicsComponent.
Scheduled Physics Thread command lambdas with resimulation handling.
Added new settings and features to balance simulated proxies and post-resimulation corrections.
Option to trigger a resim when receiving new inputs.
Option to apply input decay curve over a set time instead of over the remaining resim frames.
Option to decay post-resim error in render interpolation exponentially, with a half-life setting.
Bug Fix:
Fixed an issue where inputs can get dropped when the server input-buffer runs empty because only the latest received input gets injected at the front of the buffer.
Fixed an issue where input wouldn't be produced for locally controlled pawns not using a player controller.
Fixed Geometry Collection and Cluster Union post-resimulation render interpolation issues with stuttering and rotational calculation.
Added fixes for inputs getting lost.
Tools
BuildGraph
New:
Added the Boolean attribute ReportOnExecution to report diagnostics during execution of a step. The name list attribute ReportOnNodes is used to limit which nodes will report diagnostics during execution.
UnrealGameSync
Bug Fix:
Fixed an issue where Update Settings would fallback to Horde when changing theme even though Perforce was previously selected.
Virtual Production
Compositing
New:
Marked HoldoutComposite plugin as hidden, since it was deprecated & renamed to CompositeCore.
Changed the default Lens Distortion rendering mode of the Lens Component to use the Lens Distortion Scene View Extension.
nDisplay
New:
Removed a dependency on legacy Composure.
Bug Fix:
Improved stage geometry mesh generation to mitigate deformities when geometry edges are near the mesh equator.
Fixed an issue where the ICVFX window would throw a failed assert when -rhivalidation was used.
Performance Capture
New:
LiveLink:
Added a LiveLink Broadcast Component. This component currently allows streaming LiveLink data for Transform, Camera, and Skeletal Mesh data. Adding a broadcast component will create a LiveLink subject that automatically rebroadcasts data from the component.
You can now synchronize a Virtual Subject rebroadcast to one of its subjects.You can enable this through the "Sync Subject" option on Virtual Subjects.
Live Link Hub:
Added a playback mode, which is a compact view of the playback widget. Keyboard Shortcuts for Recording Playback
Left / Backspace: Step back one frame (hold to scrub backward).
Right: Step forward one frame (hold to scrub forward)
Space / Enter: Toggle pause Added a "Select Recording" button when no recording is selected, which opens a pop up window with the recording list.
Added support for config autosave.
Refactored the discovery mechanism to enable seeing all clients without connecting to them automatically.
Added a crash recovery mechanism that attempts to restore the last autosave after launching following a crash.
Note: When launching multiple Live Link Hub instances, this system will only allow crash recovery for the first session that was launched.
Added Client filtering and filter presets support.
Added more information to the discovered clients list (IP, Hostname, Project, Level).
Aja: Updated Aja SDK to 17.5.0
Users can now choose what class of prop component to use. Default is the native version but users can override with their own derived class for uses such as building custom constraint behaviours.
Added a delegate to emit when a Live Link subject's bool bIsEnabled is modified. Required for Performance Capture workflow to respond to subjects being modified in the Live Link client panel.
Removed Mocap Manager requiring all spawned characters to be a ACaptureCharacter actor. All ASkeletalMeshActor classes can now be set to the CaptureCharacterClass property in a PCapCharacterDataAsset.
Changed CaptureCharacterClass member type in UPCapCharacterDataAsset from TSoftClassPtr to TSoftClassPtr.
Relocated the Performance Capture properties under a 'Performance Capture' details category for ACaptureCharacter actors.
Improved PIE/SIE usability of the stage manager and the outliner.
Cleaned up unused nodes in mocap manager EW.
Refactor of LiveLink data pausing:
Moved all calls from the individual actor components (performer, prop, retarget) to simple pausing the LiveLink data on the LiveLink client.
Subjects that are paused can still be recorded in Mocap Recorder.
Pausing a subject will update the pause state in the UI in all locations.
Subjects that go invalid will no longer be removed from Record Manager. Only subjects that are disabled (requires UI interaction with Live Link panel to accomplish) will be disabled from being recorded.
Removed tracking what's paused and what's enabled from the LiveLinkEval struct and renamed to LiveLinkVisual. The array of this struct in the viewmodel now only keeps track of what subjects are being visualised.
All calls to determine a subject's state or enablement go to the Live Link Blueprint function library functions.
Introduced the functionality to calculate a dynamic prop offset via Blueprint native function (dynamic constraint).
Added Function library to query IK Rig and Retargeter properties at run time for calculating dynamic constraint.
Improved handling of spawning custom props actors from the PCap Prop data asset.
Added runtime module for -game sessions.
Refactored actor, actor component and animinstance classes into new runtime module to enable running tools/actors in -game session.
Added redirectors to new class locations.
Updated plugin description to aid discoverability in the plugin browser by including text referring to Mocap Manager.
Enabled Mocap Manager retarget tuner and prop offset widgets to run in PIE/SIE.
Added F keyboard binding to focus on Pcap UMG viewport actor.
Mocap Manager Viewmodel now caches the initial state of Take Recorder settings and reverts them to the initial state when closing Mocap Manager.
Users can now select a folder for their PCap data.
Can now be a Content Plugin path or a game content path.
Now creates a session template per project as part of the first-run workflow, removing dependency away from Engine/Plugin content.
The session template is now unique per uproject.
Did a full pass on all Blueprints, setting namespace to PerformanceCapture on all assets, to prevent functions leaking into the function palette when they're not wanted.
Added Hide actor in-game button to outliner, only visible during a multi user session.
Added missing delegate for when a Live Link subject is added.
This is needed for Virtual Subjects.
Added OnLiveLinkSubjectAdded delete to the PerformanceCaptureSubsystem.
Now remove illegal characters from the filename of created Skelmesh when using Live Link subject name as the basis for the new asset's name.
Improved scaled performer mesh workflow:
Now uses poseable mesh component to shuttle live link transforms to the new skelmesh.
Added ability for user to a freeze the pelvis bone above the origin.
Added bone picker so users can choose which bones is the pelvis
Auto find the pelvis bone function executed on invoking the panel.
Warning if the bones in the given skelmesh do not match the Live Link data.
Modified the bone visualizer to work with any actor containing at least one skinnned mesh component. Always defaults to the first found skinned mesh.
Removed pausing/unpausing of render in the main level viewport when starting the custom UMG viewport. This was negatively impacting prop line up workflows when the user wants to use both viewports.
Added exclusion list of components to the Take Recorder permission list User Asset data object and a function to audit a Take Recorded actor's components in the motion actor row of Mocap Recorder.
Users can now filter recording on component names.
Bug Fix:
LiveLink: Added multi-select for subjects, so you can pause multiple subjects at once.
Live Link Hub:
Added a column that displays the translated role for a subject (hidden by default).
Fixed Live Link Hub resetting timecode and genlock upon exiting, even if these options were not enabled in the Hub.
Can now pick an interpolation processor if transmitting evaluated data is enabled.
Pause subjects when pausing a recording so they appear as valid on UE clients. Dragging the playback slider will no longer pause recording on end if the recording wasn't paused.
Added a prompt to verify if the user intends to close the hub before closing.
You can turn off this behavior by changing the "Confirm Close" option in the LiveLinkHub settings.
Fixed a crash when launching a game in shipping configuration with Live Link Hub plugin enabled.
Fixed potential Multiuser crash caused by emitting change to take recorder metadata during recording. Emit is now gated behind bIsRecording=false.
Retarget character mesh will now tick and update pose on the same frame as the perforrmer source mesh.
Prevented base mocap mesh getting set to null after creating a performer.
Prevented character name getting set to null when creating a character data asset.
Prevented pre-requisite cycle when SourceMesh == ControlledMesh because FComponentReference wants to set default to first skelmesh component on the owning actor.
Fixed crash in Performer mesh creation if the chosen skelmesh has no valid skeleton assigned.
Fixed session missing message after first-run creating the base PCap datatables.
Fixed Motion outliner UI getting invalid information from the level when assets have been deleted which the mocap actors reference.
Fixed bug with mesh visualizer in Performer mesh workflow not clearing the mesh from the viewport.
Fixed bug where Live Link recording subjects aren't refreshed when subjects are removed from the record manager.
Fixed a bug in the Mocap Manager picker widget preventing excessive calls to the asset registry during Take recording.
Deprecated
Deprecated the SourcePerformer, RetargetAsset and bForceAllSkeletalMeshesToFollowLeader properties on ACaptureCharacter in favor of the same properties on URetargetComponent.
Deprecated the AdditionalMeshes property on UPCapCharacterDataAsset.
Rendering
New:
Exposed linear versions of the UE emulation color spaces in OpenColorIO plugin config, useful for tonecurve inversion for example.
Fixed lens distortion material default support for packaged games.
Tools
New:
Live Link Hub:
Store external plugin paths in a versioned directory that reflects the plugin ABI (e.g. "%LocalAppData%\UnrealEngine\LiveLinkHub_5.7"). Outside of an installed build, the workspace Engine/Config directory is used instead.
Added "auxiliary channel" endpoint negotiation. It's now possible to register a channel type handler with ILiveLinkHubMessagingModule, and initiate a channel request to a known client using ILiveLinkHubClientsModel.
Fixed not properly replaying tracks that had inconsistent framerate or data.
A track's timestamps are now always used when seeking to frames across tracks rather than only relying on qualified frame time conversions. For efficiency we still convert the desired frame time to a track's local frame time first which often puts as at or near the desired frame.
Timestamps are now saved and loaded in bulk, rather than with each frame. For old recordings the file is iterated once to load the timestamps, which can be slow.
Added an Upgrade feature which will force load the entire recording into memory and then save it to a new file, providing users a way to convert old animations to the new format, and decrease future load times. The recording list will now specify if a version is outdated or not. If a recording is outdated a context menu option "Upgrade Recording" will be available.
Fixed multiple event fires when committing a scrubber change via spin boxes.
Fixed a crash when exiting the app while streaming frames.
Added extendable data for Productions.
User defined UStructs can be registered as extended data types and are displayed in the Production Wizard.
This data is saved with each Production in the default engine configuration file (Engine.ini).
User defined customizations can be registered for the Production Wizard for registered extended data types.
User defined 'User Settings' tabs can be registered to the Production Wizard.
Added a Tracking Alignment Tool into the Camera Calibration plugin. This tool aligns two tracking spaces together by calculating the aligned origin transform of one of the tracking spaces.
Remote Control:
Made behaviors rearrangeable in the RC panel.
Added Select Source button to the action list
Also added icon to right click on exposed property right click menu.
Changed "in use" visualisation for properties to a background color similar to selection.
Added indication of whether a property is bound to a controller.
Added support for enums and additional struct types.
"Fill path from selected asset" now looks for selected exposed properties if there are no assets selected.
Added a stateless controller button.
Revamped path behavior.
Added the "controller" category .
Changed entity bind numbers over to runtime objects.
You can now select bound action sources.
Switchboard:
Updated the BP OSCListener to use the TR subsystem in all functions. Now all calls to get take metadata use the Subsystem so it can be used without take recorder being open (Mocap Manager)
Start and stop recording now uses the subsystem and will open a level sequence by default to keep the behaviour the same as previous when triggering start record from SB.
Removed some debug prints that snuck in during the dev process that don't help the end-user.
Added an experimental "Use Fast Sync" option to Source Control Settings.
This enables incremental sync functionality in sbl_helper.py.
In the case where the currently synced changelist is known, and we are syncing ahead to a future changelist, we can pass a revision range to the Perforce commands involved in order to achieve a potentially dramatic speedup (reductions from >3 minutes to <30 seconds were observed in large projects internally).
Perforce changelist dropdown refresh now occurs asynchronously, avoiding attendant UI hitches/hangs for long-running Perforce operations.
sbl_helper.py now explicitly maintains workspace sync state in JSON files in the engine/project directories; this is more reliable than the previous mechanism which relied on `p4 cstat ...#have`.
Additionally, if the workspace is "dirty," this will be indicated by an asterisk next to the changelist indicators in Switchboard.
Added a button to the progress dialog to interrupt population / refresh of the asset cache, which can take a long time in large projects.
Can now pass command line arguments to specify the Unreal Editor OSC server address and port.
Added a setting to optionally the Live Link Hub device to suppress the crash recovery dialog following an unclean shutdown.
Take Recorder:
Root cinematics path can now refer to both content and plugin content.
Made Take Recorder Source types public. Sources that weren't already exported now are. This is for consistency since all sources were previously exposed to Blueprints.
Fixed custom time dilation failing when bStartAtCurrentTimecode is true and sequencer is disabled.
Added a command line flag to bypass source control checks when joining a Multi-user session. The new command line arg is -CONCERTSKIPSOURCECONTROLCHECKS.
Motion Design:
Text3D:
Hid the Text3DCharacterTransform from the "add component" list to avoid being added to the new Text3D.
The UText3DLayoutTransformEffect is the new approach to handle per character transform, and keep components to migrate properties to newer systems.
Adding LocationBegin in LayoutTransformEffect to adjust starting offset.
Recycle components instead of creating/destroying using a pool.
Components and renderer are no longer transient.
Reduced number of components needed by 2
Suppressed material & mesh warning when using Text3DComponent in a Blueprint.
Added effects section for text (layout effects) in Details panel.
Reworked the default text transform extension effect to support ease curve.
Fixed the mask material function to work fully in local space without continuous updates to adjust itself.
Added missing Blueprint functions to retrieve text extensions.
Now uses a single custom material for front, back, extrude, bevel slots.
Naming Tokens:
Now supports case-insensitive namespace lookup. bForceCaseSensitive is now recognized for namespaces to force case-sensitive checks.
Registering namespaces is unchanged, and still requires a unique name regardless of case.
Added Naming Tokens Editable Text Box UMG widget for displaying token text, both as raw tokens and resolved tokens. This wraps a new slate version: SNamingTokensEditableTextBox.
The default behavior allows you to type in text with {tokens} through NamingTokens that are automatically resolved when committing the text.
An autocomplete suggestion dropdown is included which allows you to search for namespaces and tokens and automatically insert them into the text box.
Added EvaluateTokenList API to evaluate specific tokens and return their evaluation data.
Added the TokenNamespace field to FNamingTokenValueData so the namespace is always returned.
Added a CombineNamespaceAndTokenKey utility function in case the key and namespace need to be recombined.
Added support for specifying additional mount points via the command line for the storm sync plugin.
SwitchboardListener: Enabled separate handling of stdout and stderr streams.
Template Level Sequences or Cine Assemblies can now be set for assembly and sub-assembly construction through the Cine Assembly Schema 'Content Hierarchy' tab.
Using the take recording feature, you can now capture microphone audio sources on -game clients.
Created a new stat category for the Take Recorder and its sources. This allows users to see what sources are assigned on a -game client.
CineAssembly
Added Productions level toolbar to change the active production.
Added naming token support in Cine Assembly Schema metadata String fields.
Added Python functionality to access and set the author property of a CineAssembly(get_author, set_author).
Added Blueprint functionality to access and set the author property of a CineAssembly (GetAuthor, SetAuthor)
Added Python functionality to access the created data and time of a CineAssembly (get_created_string, get_date_created_string, get_time_created_string).
Added Blueprint functionality to access the created data and time of a CineAssembly (GetCreatedString, GetDateCreatedString, GetTimeCreatedString).
Added a new token to access a CineAssembly's author property ({author}).
Added a new token to access a CineAssembly's created date and time ({created}, {dateCreated}, {timeCreated}).
Exposed the author property of a CineAssembly at creation time in the CineAssembly creation window details.
Added a new property (bIsDataOnly) to Cine Assembly Schema's and Cine Assemblies to set schemas and assemblies as data only.
Data Only CineAssemblies now cannot be added as SubSequences to other Sequences or Assemblies.
SubSequence compatibility with a parent sequence is checked by two new optional virtual functions on UMovieSceneSequence (IsCompatibleSubSequence, IsCompatibleAsSubSequence).
Added a Shot Duplication tool to the Cinematic Assembly Tools plugin, featuring configurable options for duplicating the subsequences of a Cinematic Assembly asset.
Added a new asset content menu entry widget to set the favourite rating of a Level Sequence or Cine Assembly.
Added a widget to the 'Edit Properties' window of a Level Sequence and Cine Assembly to set the favorite rating.
Added display of the favorite rating of a Level Sequence or Cine Assembly in their Content Browser asset tooltips.
Removed reflect visibility in-game cvar for users. A new workflow is supported in the level editor where users have more explicit control over level visibility.
When recording multiple clients in Take Recorder, we recommend that you disable remote sequencer open. An error is now displayed to enforce this condition.
Bug Fix:
Fixed Remote Control Interception on function calls with constant reference parameters.
Take Recorder:
Fixed not applying time dilation when Sequencer was closed.
Now transacts when removing a source from the subsystem, fixing MultiUser usage.
Fixed OnStopped event not firing in subsystem.
Fixed recording over an existing level sequence crashing when using the Take Recorder subsystem.
ActorRecordingSettings no longer creates settings objects in the constructor, improving struct validation times.
Fixed Take Recorder Subsystem IsReviewing() returning true for a frame when stopping a recording.
Fixed GetLastRecordedLevelSequence not returning the last level sequence while reviewing a recording.
Fixed a crash when creating a level snapshot in a multi-user session.
Fixed a crash that occurred when a Cine Assembly Schema was created with a name whose length exceeded path limits.
Naming Tokens:
Evaluation data no longer initializes datetime in the constructor, fixing an issue with CDO stability.
Now provides world context by default.
Motion Design:
Text3D:
Fixed missing glyph geometry when using some fonts like Antonio, Teko... caused by the code checking if a contour is contained within another only testing a segment instead of the entire polygon or bounding box.
Fixed UnrealServer compilation warnings caused by FreeType and HarfBuzz macro redefinition.
Fixed dynamic mesh renderer crash when text gets regenerated due to update flags not triggering a complete refresh of the render proxy.
Added game ready player collisions for static and dynamic mesh
Fixed layout extension to handle RTL text.
Adjusted wrapping code for RTL text.
Fixed Text3D can be used in packaged builds.
Switchboard:
Included rsync daemon in the job object to ensure it doesn't outlive the Switchboard process.
No longer discard keystrokes in the Add Device dialog that would otherwise cause the device name to collide with an existing device.
SwitchboardListener:
Avoided leaking ETW trace sessions via PresentMon invocations in the event of unclean shutdown.
Prevented child processes from inheriting unintended handles. Unintentionally leaking various resources into child processes that outlive SBL is suspected to be involved in a multitude of intermittent issues, such as:
Inability to bind to the configured listening port when re-launching SBL.
NVAPI initialization failures.
Network performance degradation and disconnects.
Updated OSCSwitchboard editor utility object to use new Take Recorder Subsystem events in addition to keeping the legacy TR BP delegate events.
Mocap Record manager: Added missing calls to emit take and slate changes and to accept an externally called StartRecording event.
Remote Control:
Fixed issues with deleting/renaming groups in the group context menu.
Fixed a crash when playing a level in PIE with embedded Remote Control preset and opening another level while PIE is running.
Fixed an issue where the Create Camera button would not show up for Cine Assemblies in the Sequencer editor.
Fixed a Web Remote Control building issue on Mac where the bin directory added to PATH in the Start script was not absolute causing the subsequent web app scripts to fail.
Protocol bindings now correctly mark the preset modified when changing the override mask.
Fixed issue where the 'Add Actor Track' menu option would not show up for Cine Assembly assets.
Live Link Hub:
Fixed play and reverse button tooltips not updating correctly while in playback.
Fixed a freeze when looping large recordings.
Fixed a freeze if waiting for frames to buffer where the range required was spread across different tracks, but not within a single track.
Fixed a possible freeze when reversing or stopping a recording immediately after looping.
Fixed the default selection end time possibly ending early. Recording length now goes by furthest track timestamp, not frame number.
Added a delay when scanning the asset registry after a directory change detection to help cases where the file system may still be locking the file after a manual move.
Added a recording context option to rescan the recording list manually.
Prevent loading or creating a config if the playback session is active.
Fixed recordings not always looping.
Improved frame time calculation and increased precision.
Buffer range reported should no longer report past max frames.
Fixed issues when jumping to a specific frame. Waiting for a frame to buffer will now properly validate the frame is ready across all tracks. Fixes several issues:
Previously buffered frames that were cached and pending removal would still be considered buffered even if they weren't ready, resulting in the wrong frame being displayed initially.
Jumping to a frame that was buffered and ready on one track, but not ready on another track that had inconsistent frames or a faster frame rate would not wait for this track's frame to be ready, displaying the wrong frame.
Reversing from the start to end frame, such as from a reverse play loop, would hit one or both of these issues and the animation would not always continue playing correctly.
UDP Messaging:
Fixed an issue when the loopback device was not added to the multicast group; so only the first editor instance launch would receive multicast packets. We now always join the group across all instances so other editor instances can be in the same multicast group.
Made multiple reliability improvements to UDP Messaging.
Fixed Media Plate's Aspect Ratio and Mesh Mode transactions to fix Multi-User operations.
VR Editor: FVREditorModeManager now explicitly shuts down VR Editor in response to FEditorDelegates::OnEditorPreExit.
Fixed the Render Grid crashing when passing in an empty string when setting Remote Control values
Fixed an issue where attaching an actor to the socket of a skinned mesh actor would not transact in Multi-User or reapply the attachment as part of an undo operation.
Multiuser: Fixed a possible crash when stopping a take record or reverting take changes.
Capture Manager: Fixed several crashes while aborting take upload.
Deprecated:
Lens Calibration no longer depends on (legacy) Composure, and all features that relied on it have been replicated using internal functionality. Opening lens file assets will no longer add a temporary Composure actor to the level.
Templates
New:
VR Template:
The directional light is now configured to draw shadows on standalone XR platforms. Enabled Single Sample Shadow from Stationary Lights on BP_Pistol to reduce shadow cost (it's already enabled on all other dynamic actors in the scene).
Implemented an example of how Passthrough can be toggled. The option can be found in the hand menu. Note that this native Passthrough solution is currently only available on Meta Quest as the OpenXR runtime must support XR_EXT_composition_layer_inverted_alpha.
VR Template content has now been moved to be a shared template resource named XRFramework. This enables the VR template content to be used in multiple templates.
The mannequin hands are now a shared template resource. We can now use them in multiple XR templates.
Renamed Blueprints to match the style guide of new templates
Added unique descriptions to all Input Actions and Input Mapping Contexts
Added the Android Runtime category tag for immersive mode selection. See the OpenXR specifications appendix about the Android runtime category for more information.
Bug Fix:
VR Template:
Now prevent VR Spectator inputs if HMD is not enabled. This fixes an issue when trying to use a mouse and keyboard pawn in the VR Template for testing.
Grab-logic now works even if MotionControllerSource is changed to non-default (such as Palm).
Fixed hand models staying hidden if switching which hand the Pistol was being held with.
Rebuilt lighting to get rid of shadow artifacts from Point Lights.
Collaborative Viewer Template: Fixed default pawn not turning when moving mouse. The template used a Set Mouse Position-function hack which doesn't behave the same as it used to, and input logic had to be updated to not use that function in the same way.
Notas de atualização
Animation
Control Rig
Upgrade Notes:
Projects using Control Rig Physics, previously provided by the Physics Control plugin, will now need to enable the Control Rig Physics plugin as well.
Runtime
API Change:
Since this code change causes some variables to become unused in a variant of UpdateHistory_TransformHistory, it is now marked as deprecated.
The signature of experimental function UpdateHistory_WorldSpace has been changed
Editor
Framework
Upgrade Notes:
Previously, the UEdGraphSchema performed asset reference filtering when dropping assets on graphs (but not nodes or pins). This high level assumption doesn't hold up for all types of graphs, for example, some graphs open the asset dropped on them for edit. Since the UEdGraphSchema doesn't have knowledge of what the graph represents, asset reference filtering has moved to the implementation details of the various graphs that support it.
Any classes that derive from UEdGraphSchema and implement DroppedAssetsOnNode should perform their own asset reference filtering if dropping an asset on the graph creates a reference from the graph asset to the dropped asset.
UI
API Change:
Public access to UFont::CompositeFont is now deprecated.
Use UFont::GetCompositeFont() if you want to resolve the FCompositeFont to use at runtime (if any).
Use UFont::GetInternalCompositeFont() or UFont::GetMutableInternalCompositeFont() if you need to specifically access/modify UFont::CompositeFont.
Developers should carefully review their use of GetCachedWidget. If a system depends on the outer wrapped widget being returned, use GetWrappedWidget instead. GetCachedWidget may not always return the wrapped widget as expected.
UX
API Change:
The depth bar supports displaying custom widgets that are automatically arranged by depth. This is used in the Level Viewport Client to display selected objects along the depth bar.
These features can be disabled with the "r.Editor.ManualOrthoDepth 0" CVar.
Foundation
Build
Upgrade Notes:
For projects overriding UAssetManager's functions GetPackageManagers, ModifyCook, GetPackageCookRule, GetPackageChunkIds, or UpdateManagementDatabase, there is now an additional EDependencyProperty::CookRule on EDependencyCategory::Manage properties, and there are two types of PackageManagers reported by the UAssetManager:
GetPackageManagers for managers that control only chunk assignment (which pakfile/iostore container an Asset is placed into).
GetPackageCookRuleManagers for managers that affect both cookrule (whether an Asset gets cooked), and chunk assignment.
Assets that declare usedingame dependencies affect both categories of their dependencies.
Assets that declare editoronly, non-build dependencies affect neither.
Assets that declare editoronly, build dependencies affect chunk assignment but not the cookrule. This new property was added to support correct chunk assignment for platform-specific dependencies.
Core
API Change:
MSVC v14.50 compiler bundled with Visual Studio 2026 is not currently supported.
Developers can change the default behavior of TArray<> and related containers to behave more like traditional C++ containers, so that they will only compact when Shrink() is explicitly called. Use the `FNonshrinkingAllocator` as your array allocator to request this behavior. This can also be passed as the secondary allocator for TInlineAllocator.
API Change:
Nuget packages will continue to be audited for other configurations as these are urgent issues to address, but this will prevent blocking errors for licensees and CI while they are addressed.
Dev Tools
Upgrade Notes:
Updating Project Build Settings:
If your project is a code project, the following applies. This does not apply to content-only projects, as they do not contain *Target.cs files.
For Launcher & Installed Engine Builds:
For each *Target.cs file in your project, update the build settings to V6:DefaultBuildSettings = BuildSettingsVersion.V6
Note: If the project is opened from the Epic Games Launcher, you’ll see a prompt identifying which *Target.cs file must be updated. After making this change, reopen the project.
For Source Engine Builds (not an installed version):
For each *Target.cs file in your project, you have two options:
Recommended (Upgrade): Follow the same steps as for Launcher & Installed builds and set the DefaultBuildSettings:DefaultBuildSettings = BuildSettingsVersion.V6.
Stay on Current Build Settings: If you wish to remain on your existing DefaultBuildSettings, you must declare a unique build environment:BuildEnvironment = TargetBuildEnvironment.Unique.
Framework
Audio
Upgrade Notes:
Existing subtitles inside Asset UserData will need to be remade.
Any classes inheriting from USubtitleTextBlock need to instead inherit from USubtitleWidget.
Gameplay
API Change:
You can suppress the deprecation warnings with the bEnabledLegacyMappingDeprecationWarnings option in the project's input settings.
The CVar AbilitySystem.WarnCooldownEffectWithoutTags can be used to opt-out of this, for example if your GameplayAbility subclass implements a different way of checking cooldowns.
Trying to create a FTickableGameObject with default options from a worker thread (such as during async loading) will now ensure as this is a race condition that could crash. To fix this, use the new FTickableGameObject(ETickableTickType::Never) constructor and then call SetTickableTickType after initialization is complete.
If you make a custom camera node evaluator, you can now opt-out of features you don't need, but you get them all by default. It avoids the situation where making a new node results on stuff not working because you didn't add the correct flag.
This behavior is enabled by default, but you can go back to processing only on the main game thread with this console variable: [ConsoleVariables] WindowsApplication.UseWorkerThreadForRawInput=false
Authors of custom movement modes in Mover 2.0 will need to update their code:
Callers must now provide an angular velocity to FMoverDefaultSyncState::SetTransforms_WorldSpace in order to ensure that angular velocity can persist when changing mode
FRotator FProposedMove::AngularVelocity is now replaced by FVector FProposedMove::AngularVelocityDegrees.
UMovementUtils::ComputeAngularVelocity is now deprecated, callers should use ComputeAngularVelocityDegrees
Add a way to deprecate specific "legacy" axis and action mapping names. If this flag is set to true on the project settings, then any BP references to it will have a deprecation warning. Any C++ Bind calls using these names will also emit a warning.
Some of your camera rigs may need some parameters to be pre-blended. Backwards compatibility was not kept for this change (it was too costly and unnecessary given GameplayCameras' "Experimental" status) so you'll have to re-enable the option for these parameters.
Added a "IsVirtual" flag to FKeys so that you check at runtime if the key is virtual.
Added two new virtual keys for accept and back, which are bindable and useable in Enhanced Input.
We need to make new keys here because FKeys are serialized via their FName, so in order to make sure that it properly serializes per-platform we need to save out the keys with unique names and then populate the key details with the "real" value at runtime.
Check for the instigating controller on an actor.
For actor components, get the owning actor and check that instigating controller.
Upgrade Notes:
If you are dealing with the map-placed actor duplicating bindings bug in UE 5.5 and 5.6, see the resolution notes here.
Mass
API Change:
Renamed all `FMassBatchedCommand::Execute` overrides to `Run` and made it non-constant.
Level Design and Art Tools
Landscape
API Change:
Example Command Line: ProjectName MapName -run=WorldPartitionBuilderCommandlet -SCCProvider=Perforce -Builder=WorldPartitionLandscapeBuilder -AllowCommandletRendering ( -IterativeCellSize=Value)
Deprecated ULandscapeEditLayerBase::GetActions and FEditLayerAction to remove custom actions from runtime logic. Edit Layer customization classes can implement IEditLayerCustomization and register to the Landscape Editor module.
Online
Crash Reporter
Upgrade Notes:
Previously, the format was protobuf and needed to be converted using plcrashutil, but now the format is crashlog.
Platform
Mac
Upgrade Notes:
If HairStrands rendering is needed on Mac SM5, the feature can be enabled in addition to using the experimental feature bindless SM5 in project settings.
XR
Upgrade Notes:
If your project has an xr.MobileLDRDynamicResolution setting, you should replace it with an xr.MobilePrimaryScalingMode setting:
xr.MobileLDRDynamicResolution=0 -> xr.MobilePrimaryScalingMode=0
xr.MobileLDRDynamicResolution=1 -> xr.MobilePrimaryScalingMode=1
API Change:
Added FOpenXRRenderBridge::RunOnRHISubmissionThread, which should be used to wrap all OpenXR calls that can submit directly to the graphics queue (xrBeginFrame, xrEndFrame, xrAcquireSwapchainImage, xrReleaseSwapchainImage).
xrEndFrame in FOpenXRHMD is currently exempted because the submission thread is flushed before we present.
Rendering
Lighting
Upgrade Notes:
Added immediately deprecated r.LightMaxDrawDistanceScale.UseLegacyFadeBehavior_WillBeRemoved to temporarily restore previous behavior.
Materials and Shaders
API Change:
Cached the ShaderPlatform inside MaterialResource, derive the FeatureLevel from that ShaderPlatform.
Cache/Find MaterialResource by QualityLevel/ShaderPlatform instead of QualityLevel/FeatureLevel.
Deprecated all the Setter/Getter functions for MaterialResource, MaterialRelevance that take FeatureLevel and replace them with ShaderPlatform.
Deprecated all FMaterialResource/FMaterial/UMaterial/UMaterialInstance functions that take ShaderPlatform as argument, since the ShaderPlatform should already be cached inside the MaterialResource when it was added.
Deprecated BuildFeatureLevelWidget, LoadEditorFeatureLevel, SaveEditorFeatureLevel for BuildShaderPlatformWidget, LoadEditorShaderPlatformPreview, SaveEditorShaderPlatformPreview.
Deprecated GetCurrentFeatureLevelPreviewText, GetCurrentFeatureLevelPreviewTextVisibility, BuildFeatureLevelWidget for GetCurrentShaderPlatformPreviewText, GetCurrentShaderPlatformPreviewTextVisibility, BuildShaderPlatformWidgetMark.
Deprecated virtual functions from MaterialInterface and FMaterial as final to avoid silent errors.
MegaLights
API Change:
Marking for HairStrands data is not yet implemented; it will produce a warning. "Reference mode" works the same with raytracing and will often tend to work with VSM, but could in theory miss marking some pages, so also produces a warning. This is not expected to be a useful mode though as reference mode should generally use raytracing (and perhaps should force it for all lights).
Simulation
Core Physics
API Change:
Added a dependency to the ChaosCore module.
Modular Vehicles
API Change:
Added an additional input quantization mechanism.
Virtual Production
Tools
API Change:
GetValue and GetValueInArray of the IRemoteControlPropertyHandle now correctly take UObject* references.
Remove ProvidedNamespace as it was not in use anywhere. No deprecation as this is an experimental plugin.