Menu
CoddyTech

Contraccolpo

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 57 di 71.

Un contraccolpo è una spinta che allontana da ciò che ti ha colpito: un impulso lungo la linea che va da chi colpisce alla cosa colpita. Questo paraurti respinge tutto ciò che ci sbatte contro:

[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 punta dal paraurti alla cosa che l'ha colpito. La sua coordinata y viene impostata a 0, così la spinta resta orizzontale, mentre normalized fa sì che abbia sempre la stessa intensità, indipendentemente dalla distanza tra i due centri. ForceMode.Impulse è una spinta istantanea: cambia la velocità di una quantità pari a power diviso per la massa, tutta in una volta, quindi una palla di massa 2 schizza via a metà della velocità di una palla di massa 1. Il valore predefinito ForceMode.Force è pensato per essere applicato a ogni passaggio e fornisce l'effetto di un solo passaggio, 50 volte inferiore.

La spinta dura solo finché niente sovrascrive la velocità. Un giocatore il cui FixedUpdate imposta rb.linearVelocity in base alle frecce a ogni passaggio perde la spinta al passaggio successivo; quindi, uno script del genere deve lasciare invariata la velocità per un momento dopo un colpo, oppure muovere il giocatore applicando delle forze.

challenge icon

Sfida

Medio

Consenti al giocatore di scatenare un'onda d'urto con la barra spaziatrice.

  1. Quando viene eseguito Input.GetKeyDown(KeyCode.Space), usa il ciclo foreach (Collider hit in Physics.OverlapSphere(transform.position, radius)), ignorando il collider del giocatore.
  2. Per ogni hit.TryGetComponent(out Rigidbody body), calcola away = hit.transform.position - transform.position con away.y = 0f.
  3. Chiama body.AddForce(away.normalized * power + Vector3.up * lift, ForceMode.Impulse);.

Premi «Gioca» e premi la barra spaziatrice vicino alle casse. Poi premi «Verifica».

Provalo tu

using UnityEngine;

public class Shockwave : MonoBehaviour
{
    [SerializeField] private float radius = 4f;
    [SerializeField] private float power = 6f;
    [SerializeField] private float lift = 2f;

    void Update()
    {
        // premendo Space: spingi ogni Rigidbody entro radius lontano dal giocatore
    }
}

Tutte le lezioni di Fisica e gameplay

Esercitati da solo: Playground Unity