Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Usando interpolações físicas
Como nós incorporamos interpolações físicas em um jogo da Godot ? Existem algumas condições ?
Nós já tentamos deixar o sistema o mais fácil possível, e muitos jogos existentes trabalharão em poucas mudanças. Dito isso, têm situações que requerem um tratamento especial, e estas serão descritas.
Ativando a configuração de interpolações físicas
O primeiro passo é ativar as interpolações físicas em Project Settings > Physics > Common > Physics Interpolation. E você pode agora rodar o seu jogo.
É provável que nada se pareça muito diferente, particularmente se você estiver rodando a física em 60 TPS ou em algum múltiplo disso. Entretanto, tem bastante coisas acontecendo atrás das cenas.
Dica
Para converter um jogo existente para usar interpolação, é altamente recomendado definir temporariamente Project Settings > Physics > Common > Physics Tick per Second para um valor baixo, como 10, o que tornará os problemas de interpolação mais óbvios.
Mova (quase) toda a lógica de jogo de _process para _physics_process
O requisito mais fundamental para a interpolação de física (que você já deve estar fazendo) é que você deve mover e executar a lógica do jogo em seus objetos dentro do _physics_process (que roda em um tique de física) em vez do _process (que roda em um quadro renderizado). Isso significa que seus scripts normalmente devem fazer a maior parte do processamento dentro do _physics_process, incluindo responder a comandos de entrada e IA.
Definir a transformação dos objetos apenas dentro dos tiques de física permite que a interpolação automática lide com as transformações entre os tiques de física e garante que o jogo rodará da mesma forma em qualquer máquina em que seja executado. Como bônus, isso também reduz o uso da CPU se o jogo estiver renderizando em FPS alto, já que a lógica de IA (por exemplo) não será mais executada a cada quadro renderizado.
Nota
Se você tentar definir a transformação (transform) de objetos interpolados fora do tick de física, os cálculos para a posição interpolada estarão incorretos e você obterá 'jitter'. Esse 'jitter' pode não ser visível na sua máquina, mas ocorrerá para alguns jogadores. Por esse motivo, definir a transformação de objetos interpolados deve ser evitado fora do tick de física. O Godot tentará produzir avisos no editor se este caso for detectado.
Dica
Esta é apenas uma regra flexível. Existem algumas ocasiões em que você pode querer teletransportar objetos fora do tique de física (por exemplo, ao iniciar um nível ou ao fazer objetos reaparecerem). Ainda assim, em geral, você deve aplicar as transformações a partir do tique de física.
Garanta que todos os movimentos indiretos aconteçam durante os ticks de física
Considere que no Godot, os nós podem ser movidos não apenas diretamente em seus próprios scripts, mas também por métodos automáticos, como tweening, animação e navegação. Todos esses métodos também devem ter seus tempos definidos para operar no tique de física em vez de a cada quadro ("idle"), se você os estiver usando para mover objetos (esses métodos também podem ser usados para controlar propriedades que não são interpoladas).
Nota
Considere também que os nós podem ser movidos não apenas movendo a si mesmos, mas também movendo nós pais na SceneTree. O movimento dos pais, portanto, também deve ocorrer apenas durante os tiques de física.
Escolha uma taxa de ticks de física
Ao usar a interpolação de física, a renderização é desacoplada da física e você pode escolher qualquer valor que faça sentido para o seu jogo. Você não está mais limitado a valores que sejam múltiplos da taxa de atualização do monitor do usuário (para uma jogabilidade sem engasgos se o FPS alvo for atingido).
Um guia difícil:
Taxas de ticks baixas (10 - 30) |
Taxas de ticks médias (30 - 60) |
Taxas de ticks altas (60+) |
|---|---|---|
Melhor desempenho da CPU |
Bom comportamento de física em cenas complexas |
Bom(a) com físicas rápidas |
Adicione algum atraso para a entrada |
Bom(a) para jogos de primeira pessoa |
Bom(a) para jogos de corrida |
Simple physics behavior |
Nota
Você sempre pode mudar a taxa de ticks, é tão simples quanto mudar as configurações do projeto.
Chame reset_physics_interpolation() quando estiver teletransportando objetos
Na maior parte do tempo, a interpolação é o que você quer entre dois ticks de física. Entretanto, tem uma situação aonde isso pode não ser o que você quer. Isso é quando você está inicialmente colocando objetos, ou movendo eles para um novo local. Aqui, você não quer um movimento suave entre onde o objeto estava e a posição inicial - você quer um movimento instantâneo.
A solução para isso é chamar a função Node.reset_physics_interpolation. O que essa função faz internamente é definir a transformação anterior armazenada internamente do objeto para ser igual à transformação atual. Isso garante que, ao interpolar entre essas duas transformações iguais, não haverá movimento.
Mesmo se você esquecer de chamar isso, geralmente não será um problema na maioria das situações (especialmente em taxas de tiques altas). Isso é algo que você pode facilmente deixar para a fase de polimento do seu jogo. O pior que acontecerá é ver um movimento de rastro por um quadro ou mais quando você os mover — você saberá quando precisar!
Existem dois jeitos de usar reset_physics_interpolation():
Ponto inicial (por exemplo, o jogador)
Defina a transformação inicial
Chame
reset_physics_interpolation()
As transformações anteriores e atuais serão idênticas, resultando em nenhum movimento inicial.
Início de movimento (como uma bala)
Defina a transformação inicial
Chame
reset_physics_interpolation()Defina imediatamente a transformação esperada após o primeiro tique de movimento
A transformação anterior será a posição inicial, e a transformação atual agirá como se um tique de simulação já tivesse ocorrido. Isso começará a mover o objeto imediatamente, em vez de ter um atraso de tique parado.
Importante
Certifique-se de definir a transformação e chamar reset_physics_interpolation() na ordem correta, conforme mostrado acima, caso contrário, você verá 'streaking' indesejado.
Dicas de teste e depuração
Mesmo se você pretende executar a física a 60 TPS, para testar minuciosamente sua interpolação e obter a jogabilidade mais suave possível, é altamente recomendável definir temporariamente a taxa de tiques de física para um valor baixo, como 10 TPS.
A jogabilidade pode não funcionar perfeitamente, mas deve permitir que você veja mais facilmente os casos em que deve chamar Node.reset_physics_interpolation ou onde deve usar sua própria interpolação personalizada em uma, por exemplo, Camera3D. Uma vez corrigidos esses casos, você pode redefinir a taxa de tiques de física para a configuração desejada.
A outra grande vantagem de testar a uma taxa de tick baixa é que você pode notar outros sistemas de jogo que são sincronizados com o tick de física e criando falhas, das quais você pode querer contornar. Exemplos típicos incluem definir valores de blend de animação, que você pode decidir definir em _process() e interpolar manualmente.
Nota
Em 2D, a posição das formas de colisão visíveis mostradas pela opção levará em consideração a interpolação de física.
Em contrapartida, em 3D, a posição das formas de colisão visíveis não levará em consideração a interpolação de física. Isso significa que as formas de colisão visíveis podem parecer se mover de maneira menos suave e aparecer ligeiramente à frente da representação visual do objeto quando o objeto está se movendo. Isso não é um bug, mas uma consequência de como a interpolação de física é implementada em 3D.