Meus jogadores agora têm rostos de verdade.
A arquitetura: um esqueleto de corpo para todos os jogadores. É ali que vivem o motion matching, as montages e todas as animações com retarget, e eu nunca mexo nele. A cabeça é uma malha MetaHuman separada que simplesmente veste a pose do corpo, e qual cabeça um jogador recebe é definido pelo ID dele no banco de dados. Mesmo jogador, mesmo rosto, em qualquer máquina, para sempre.
Os pescoços esticavam feito girafa quando eles corriam. Eu estava escondendo o osso da cabeça do corpo para ele não atravessar o da MetaHuman. Acontece que esconder um osso colapsa a transformação dele, e a malha da cabeça copia exatamente essas transformações para se posicionar. Eu estava alimentando o rosto com um osso de cabeça corrompido. Funcionava parado e explodia em movimento.
As duas funcionalidades literalmente não podem coexistir e não existe correção por código. A resposta foi a chata, que eu tinha escrito no meu próprio documento de design no primeiro dia e depois passei horas evitando: tirar a cabeça da malha do corpo. Apagar os polígonos da cabeça no Blender e manter o osso. Que é exatamente o que os jogos de futebol de verdade fazem. Zero lógica em tempo de execução agora. Classe de problema extinta.
Lição: quando a solução limpa é "trabalho de conteúdo" e a gambiarra é "código", eu corro para o código. Esse instinto me custou uma noite.
E os rostos não são só cosméticos. Cada jogador é uma linha num banco de dados: nome, idade, contrato, potencial. Então, quando um garoto de dezessete anos da sua base estoura no time principal, ele não é o "Player_0412". Ele tem um rosto que você reconhece.
Entregue: cabeças MetaHuman sobre um corpo de animação compartilhado
Este post foi traduzido do inglês com auxílio de IA. Ler o original