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.
Sfida
MedioConsenti al giocatore di scatenare un'onda d'urto con la barra spaziatrice.
- Quando viene eseguito
Input.GetKeyDown(KeyCode.Space), usa il cicloforeach (Collider hit in Physics.OverlapSphere(transform.position, radius)), ignorando il collider del giocatore. - Per ogni
hit.TryGetComponent(out Rigidbody body), calcolaaway = hit.transform.position - transform.positionconaway.y = 0f. - 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
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 rovescia7Rotazione
Angoli di EuleroQuaternioniGuarda nella direzione in cui ti muoviRuota in modo fluidoRiepilogo: Torretta10Progetto: Fuga dall'arena
L'arenaCacciatori2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliereEsercitati da solo: Playground Unity