Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

El 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 radius del jugador con Physics.OverlapSphere.
  • Cada uno que tenga un Rigidbody, excepto el propio jugador, recibe un impulso: power directamente hacia afuera del jugador, a lo largo del suelo, más lift hacia 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
    }
}
quiz iconPonte a prueba

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