Menu
CoddyTech

Contraccolpo

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 54 di 63.

Un contraccolpo è una spinta che allontana da ciò che ti ha colpito: un impulso lungo la linea che va da chi colpisce a ciò che viene colpito. Questo respingente allontana 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 respingente verso ciò che lo ha colpito. La sua coordinata y viene impostata a 0, così la spinta resta orizzontale, e normalized gli assegna la stessa lunghezza indipendentemente dalla distanza tra i due centri. ForceMode.Impulse è una spinta istantanea: modifica la velocità di 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é nulla sovrascrive la velocità. Un giocatore il cui FixedUpdate imposta rb.linearVelocity usando le frecce a ogni passaggio la perde un passaggio dopo, quindi uno script del genere deve lasciare invariata la velocità per un momento dopo un colpo, oppure muovere il giocatore usando le forze.

challenge icon

Sfida

Medio

Il giocatore può generare un’onda d’urto. Scrivi lo script Shockwave sul Player. Nell’Inspector imposta radius (4), power (6) e lift (2). Lo script Player è pronto: le frecce muovono il giocatore.

  • Quando premi Space, trova ogni collider entro radius dal giocatore con Physics.OverlapSphere.
  • Ogni collider che ha un Rigidbody, tranne il giocatore stesso, riceve un impulso: power in orizzontale, lontano dal giocatore e lungo il terreno, più lift verso l’alto.
  • I collider senza Rigidbody, come il terreno, non vengono toccati.

Premi Play, cammina tra le casse e premi Space, poi Check.

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()
    {
        // quando si preme Space: allontana dal giocatore ogni Rigidbody entro radius
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay