For the complete documentation index, see llms.txt. This page is also available as Markdown.

Física do player

Aplique forças e impulsos ao avatar do player

Você pode aplicar forças físicas ao avatar do jogador a partir do código da sua scene. Isso permite criar mecânicas de gameplay como launch pads, zonas de vento, efeitos de knockback, explosões e muito mais.

Existem dois tipos de força que você pode aplicar:

  • Impulse: Um empurrão instantâneo de uso único. Use isto para efeitos discretos e súbitos, como lançar o jogador para o ar ou afastá-lo para trás.

  • Continuous force: Um empurrão sustentado aplicado a cada tick enquanto estiver ativo. Use isto para efeitos contínuos como zonas de vento, correntes de água ou campos gravitacionais.

Ambos são aplicados por meio do Physics helper, importado de @dcl/sdk/ecs.

Aplicar um impulso

Use Physics.applyImpulseToPlayer() para dar ao jogador um empurrão de uso único em uma direção específica.

  • vector: Direção e força combinadas — o comprimento do vector codifica a magnitude do impulso.

import { Physics } from '@dcl/sdk/ecs'
import { Vector3 } from '@dcl/sdk/math'

// Lança o jogador diretamente para cima
Physics.applyImpulseToPlayer(Vector3.create(0, 50, 0))

Você também pode passar uma direção e uma magnitude separadamente. Nesse caso, o vector de direção é normalizado automaticamente:

  • direction: Direção para empurrar — normalizada automaticamente antes da escala.

  • magnitude: Força do impulso.

Se você chamar applyImpulseToPlayer() várias vezes dentro do mesmo frame, os impulses são acumulados — eles são somados e aplicados como um único impulso combinado.

Acionar um impulso na entrada do jogador

Um padrão comum é acionar um impulso quando o jogador entra em uma área. Use uma trigger area para detectar quando o jogador entra:

Aplicar um impulso de knockback

Use Physics.applyKnockbackToPlayer() para empurrar o jogador para longe de um ponto com um único impulso. Isso é ideal para explosões, efeitos de impacto e outros disparos direcionais de uso único. A direção é calculada automaticamente a partir do ponto de origem até a posição atual do jogador.

Você pode limitar a área de efeito com um radius, e controlar como a magnitude diminui com a distância usando a opção KnockbackFalloff :

  • fromPosition: Origem do knockback no espaço do mundo (centro da explosão, posição do inimigo etc.).

  • magnitude: Força base do impulso.

  • radius: Distância máxima de efeito (padrão: Infinity).

  • falloff: Como a magnitude diminui com a distância (padrão: CONSTANT).

O KnockbackFalloff enum controla como a força diminui com a distância:

  • KnockbackFalloff.CONSTANT — mesma magnitude em qualquer distância dentro do radius (padrão)

  • KnockbackFalloff.LINEAR — diminuição linear suave até 0 na borda do radius

  • KnockbackFalloff.INVERSE_SQUARE — queda acentuada e fisicamente realista

Se o jogador estiver exatamente na posição da origem, o jogador é empurrado diretamente para cima. Uma magnitude negativa puxa o jogador em direção ao ponto, em vez de afastá-lo.

Os mesmos KnockbackFalloff values estão disponíveis para applyRepulsionForceToPlayer().

Aplicar uma força contínua

Use Physics.applyForceToPlayer() para aplicar uma força sustentada ao jogador. Ao contrário de um impulse, essa força é aplicada a cada tick enquanto permanecer ativa.

  • source: Uma entity que identifica essa origem da força — use-a para atualizar ou remover a força depois.

  • vector: Direção e força combinadas — o comprimento do vector codifica a magnitude da força.

A posição da entity de origem não é relevante — ela é usada apenas como identificador.

O vector de força está sempre em world space. Se você precisar de uma direção relativa a uma entity rotacionada, use Transform.localToWorldDirection() para convertê-la primeiro — veja Convert a local direction to world space.

Assim como em applyImpulseToPlayer(), você também pode passar uma direction e magnitude separadamente — veja Aplicar um impulso:

Se você chamar applyForceToPlayer() novamente com a mesma source entity, ela substitui a força anterior dessa origem. Se várias fontes de força forem acumuladas, seus vectors são somados a cada tick.

Remover uma força contínua

Para parar de aplicar uma força, chame Physics.removeForceFromPlayer() com uma referência à source entity que foi usada para criar a força. Se a entity não estiver aplicando uma força no momento, essa chamada é ignorada com segurança.

  • source: A entity usada quando a força foi aplicada.

Aplicar uma força por uma duração limitada

Use Physics.applyForceToPlayerForDuration() para aplicar uma força por uma quantidade específica de tempo. A duração é em segundos. A força é removida automaticamente quando o tempo se esgota. Chamar isso novamente com a mesma source entity reinicia o temporizador.

  • source: Uma entity que identifica essa source da força.

  • duration: Por quanto tempo a força dura, em segundos.

  • vector: Direção e força combinadas — o comprimento do vector codifica a magnitude da força.

O direction + magnitude overload também está disponível — veja Aplicar um impulso:

Exemplo de zona de vento

Este exemplo cria um túnel de vento que empurra o jogador enquanto ele estiver dentro dele e para quando ele sai:

Aplicar uma força de repulsão

Use Physics.applyRepulsionForceToPlayer() para empurrar continuamente o jogador para longe de um ponto fixo no espaço. Isso é adequado para efeitos como um campo de repulsão magnética, uma barreira de força ou um objeto flutuante que mantém os jogadores à distância. Ao contrário de applyKnockbackToPlayer(), essa força é recalculada a cada tick conforme o jogador se move. A magnitude enfraquece com a distância com base no radius e no falloff — veja Aplicar um impulso de knockback para as KnockbackFalloff opções. Uma magnitude negativa inverte o efeito, puxando continuamente o jogador em direção ao ponto como um vortex ou um poço gravitacional.

  • source: Uma entity usada como identificador para essa força — sua posição não é usada.

  • fromPosition: O ponto no espaço do mundo do qual o jogador é afastado.

  • magnitude: Força base da força. Valores negativos atraem em vez de repelir.

  • radius: Distância máxima de efeito (padrão: Infinity).

  • falloff: Como a magnitude diminui com a distância (padrão: CONSTANT).

Convert a local direction to world space

Use Transform.localToWorldDirection() para transformar um vector de direção do espaço de coordenadas local de uma entity para o world space, considerando toda a hierarquia de parents. Isso é útil ao aplicar forças relativas a uma entity rotacionada — por exemplo, empurrar o jogador para longe de uma face específica de um obstáculo giratório.

  • entity: A entity de origem cujo espaço local define a direção.

  • localDirection: Vector de direção nas coordenadas locais da entity.

Retorna o vector de direção em coordenadas do mundo.

Isso aplica apenas rotação — não leva em conta translação ou escala — tornando-o diretamente adequado para vectors de direção passados para funções de força e impulso.

Atualizado