Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Haz que el jugador genere una onda expansiva con la tecla Space.

  1. Al pulsar Input.GetKeyDown(KeyCode.Space), recorre foreach (Collider hit in Physics.OverlapSphere(transform.position, radius)), omitiendo el collider del propio jugador.
  2. Para cada hit.TryGetComponent(out Rigidbody body), calcula away = hit.transform.position - transform.position con away.y = 0f.
  3. 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

Practica por tu cuenta: Playground de Unity