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.
Sfida
MedioIl 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
radiusdal giocatore conPhysics.OverlapSphere. - Ogni collider che ha un Rigidbody, tranne il giocatore stesso, riceve un impulso:
powerin orizzontale, lontano dal giocatore e lungo il terreno, piùliftverso 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
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fisica e gameplay
1Corpo rigido
Gravità e massaSpingi con AddForceSalta con un impulsoFixedUpdate per la fisicaVelocitàCorpi cinematiciRiepilogo: piattaforma di lancio4Coroutine
InvokeInvokeRepeating, CancelInvokeLa tua prima coroutineCicli nelle coroutineInterrompere le coroutineRiepilogo: conto alla rovescia2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere