O multijogador acabou significando pelo menos o triplo do tempo de desenvolvimento e dos problemas que eu esperaria ao fazer Sunderstar sem ele. Até um jogo de tiro espacial relativamente simples fica complicado quando cliente e servidor discordam sobre onde uma nave ou um projétil deveria estar.
Os problemas apareciam nas ações básicas. Esperar atualizações do servidor atrasava a resposta aos comandos de movimento. Nas colisões, diferenças entre cliente e servidor podiam puxar a nave de volta para uma posição corrigida. Atualizações atrasadas dificultavam manter suave o movimento remoto.
Os disparos tinham problemas parecidos. Com a dispersão da arma, não era confiável associar um disparo local imediato ao projétil do servidor. Corrigi-lo para uma posição antiga do servidor podia fazê-lo saltar para trás ou parecer mudar de velocidade. Os efeitos de impacto também precisavam aparecer na hora certa sem piscar de novo quando chegasse a confirmação do servidor.
Mudei a nave local para prever o movimento imediatamente com os mesmos cálculos do servidor e corrigir as diferenças quando chegam as atualizações. As outras naves se movem suavemente entre as posições recebidas, com uma estimativa limitada do movimento quando as atualizações atrasam.
Colisões também precisam de previsão. O cliente agora calcula como sua nave reage a um asteroide ou a outra nave usando os dados de colisão do servidor. Só a sua nave se move localmente. Pequenas correções de posição são suavizadas; mudanças grandes, como teletransportes, acontecem imediatamente.
O projétil visual agora adota a direção do servidor sem saltar para trás, mantendo velocidade constante. Os efeitos de impacto aparecem localmente, e os efeitos correspondentes do servidor são suprimidos para que o mesmo acerto não pisque duas vezes. O servidor continua decidindo os acertos e o dano.
Também fiz a criação dos projéteis, os clarões do cano, o som e a reprodução usarem a mesma posição na ponta do cano. Alterar a previsão de movimento até revelou um erro de propriedade dos bots no modo Host que precisou ser corrigido.
As verificações automatizadas passaram, e as métricas já melhoraram na simulação de rede da Unity. Ainda preciso verificar essas melhorias em uma sessão real pela internet com um servidor dedicado.
Se você já trabalhou com multijogador, qual recurso aparentemente simples levou mais tempo para ficar certo?