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.
Desafio
MédioO 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
radiusdo jogador comPhysics.OverlapSphere. - Cada um que tenha um Rigidbody, exceto o próprio jogador, recebe um Impulse:
powerdiretamente para longe do jogador, ao longo do chão, maisliftpara 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
}
}
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
1Rigidbody
Gravidade e MassaEmpurrar com AddForcePular com um ImpulsoFixedUpdate para FísicaVelocidadeCorpos CinemáticosRevisão: Plataforma de Lançamento2Colisões
OnCollisionEnterO que eu acertei?Quebre no impactoNo chãoQuique e atritoFormas dos collidersRevisão: Parede destrutível5Projeto: Corrida das Moedas
A Bola RolanteMoedas para Coletar