Retroceso
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 54 de 63.
Un retroceso es un impulso que aleja de lo que te golpeó: un solo impulso a lo largo de la línea que va desde quien golpea hasta lo golpeado. Este parachoques hace retroceder 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 lo golpeó. Su y se establece en 0 para que el impulso se mantenga horizontal, y normalized hace que tenga el mismo tamaño independientemente de la distancia entre los dos centros. ForceMode.Impulse es un impulso único: cambia la velocidad en power dividido por la masa, de una vez, así que una pelota de masa 2 sale disparada a la mitad de velocidad que una pelota de masa 1. El ForceMode.Force predeterminado está pensado para aplicarse en cada paso y proporciona lo equivalente a un 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 como ese tiene que dejar la velocidad sin cambios durante un momento después de un golpe, o mover al jugador con fuerzas.
Desafío
IntermedioEl jugador puede generar una onda de choque. Escribe el script Shockwave en el jugador. El Inspector le asigna radius (4), power (6) y lift (2). El script Player está listo: las flechas hacen que el jugador camine.
- Al pulsar Espacio, busca todos los colliders dentro de
radiusdel jugador conPhysics.OverlapSphere. - Cada uno que tenga un Rigidbody, excepto el propio jugador, recibe un impulso:
powerdirectamente hacia afuera del jugador, a lo largo del suelo, máslifthacia arriba. - Los colliders sin Rigidbody, como el suelo, no se ven afectados.
Pulsa Play, camina entre las cajas y pulsa Espacio; después, Check.
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: empuja lejos del jugador a todos los Rigidbody dentro de radius
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
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 lanzamiento2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger