Menu
CoddyTech

Empurrão

Parte da seção Física e jogabilidade do Journey de Unity da Coddy. Lição 54 de 63.

Um empurrão para trás é um impulso para longe do que atingiu você: um impulso ao longo da linha entre quem bateu e o objeto atingido. Este para-choque empurra para trás tudo o que colide com ele:

[SerializeField] private float power = 8f;

void OnCollisionEnter(Collision collision)
{
    Vector3 away = collision.transform.position - transform.position;
    away.y = 0f;
    collision.rigidbody.AddForce(away.normalized * power, ForceMode.Impulse);
}

collision.transform.position - transform.position aponta do para-choque para o objeto que o atingiu. O y dele é definido como 0 para que o impulso permaneça nivelado, e normalized faz com que ele tenha o mesmo tamanho, independentemente da distância entre os dois centros. ForceMode.Impulse é um impulso único: ele altera a velocidade em power dividido pela massa, de uma só vez; assim, uma bola de massa 2 sai voando à metade da velocidade de uma bola de massa 1. O padrão ForceMode.Force deve ser aplicado a cada passo e fornece o equivalente a um passo, 50 vezes menos.

O impulso dura apenas enquanto nada sobrescrever a velocidade. Um jogador cujo FixedUpdate define rb.linearVelocity com base nas setas a cada passo perde esse impulso um passo depois. Portanto, um script assim precisa deixar a velocidade intacta por um momento após um impacto ou mover o jogador com forças.

challenge icon

Desafio

Médio

O jogador pode disparar uma onda de choque. Escreva o script Shockwave no Player. O Inspector fornece radius (4), power (6) e lift (2). O script Player está pronto: as teclas de direção movem o jogador.

  • Quando a tecla Space for pressionada, encontre todos os colliders dentro de radius do jogador com Physics.OverlapSphere.
  • Cada um que tenha um Rigidbody, exceto o próprio jogador, recebe um Impulse: power diretamente para longe do jogador, ao longo do chão, mais lift para cima.
  • Colliders sem um Rigidbody, como o chão, não são afetados.

Pressione Play, caminhe entre as caixas e pressione Space; em seguida, Check.

Experimente você mesmo

using UnityEngine;

public class Shockwave : MonoBehaviour
{
    [SerializeField] private float radius = 4f;
    [SerializeField] private float power = 6f;
    [SerializeField] private float lift = 2f;

    void Update()
    {
        // ao pressionar Space: empurre todos os Rigidbody dentro do radius para longe do jogador
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Física e jogabilidade