Retroceso
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 57 de 71.
Un retroceso es un impulso que aleja de lo que te golpeó: un único impulso a lo largo de la línea que va desde quien golpea hasta lo golpeado. Este parachoques empuja hacia atrás todo lo que choca contra él:
[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 apunta desde el parachoques hasta lo que chocó contra él. Su coordenada y se establece en 0 para que el impulso se mantenga horizontal, y normalized hace que tenga el mismo tamaño independientemente de lo separados que estén los dos centros. ForceMode.Impulse es un impulso único: cambia la velocidad en power dividido por la masa, de una sola vez, así que una pelota de masa 2 sale disparada a la mitad de la velocidad que una pelota de masa 1. El ForceMode.Force predeterminado está pensado para aplicarse en cada paso y proporciona el efecto de un solo paso, 50 veces menos.
El impulso dura solo mientras nada sobrescriba la velocidad. Un jugador cuyo FixedUpdate establece rb.linearVelocity a partir de las flechas en cada paso lo pierde un paso después, así que un script así tiene que dejar la velocidad sin cambios durante un momento después de un impacto, o mover al jugador mediante fuerzas.
Desafío
IntermedioHaz que el jugador genere una onda expansiva con la tecla Space.
- Al pulsar
Input.GetKeyDown(KeyCode.Space), recorreforeach (Collider hit in Physics.OverlapSphere(transform.position, radius)), omitiendo el collider del propio jugador. - Para cada
hit.TryGetComponent(out Rigidbody body), calculaaway = hit.transform.position - transform.positionconaway.y = 0f. - Llama a
body.AddForce(away.normalized * power + Vector3.up * lift, ForceMode.Impulse);.
Pulsa «Jugar» y pulsa Space entre las cajas. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class Shockwave : MonoBehaviour
{
[SerializeField] private float radius = 4f;
[SerializeField] private float power = 6f;
[SerializeField] private float lift = 2f;
void Update()
{
// al pulsar Space: aleja del jugador todos los Rigidbody dentro de radius
}
}
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puertaPractica por tu cuenta: Playground de Unity