Restare a terra
Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 11 di 71.
Ogni contatto ha una normale: una direzione di lunghezza 1, perpendicolare alla superficie che hai toccato e rivolta da essa verso il tuo oggetto. collision.GetContact(0) è il primo punto di contatto e la sua normal ti dice quale lato hai toccato. Se sei in piedi su un terreno pianeggiante è (0, 1, 0); contro una parete alla tua destra è (-1, 0, 0); se sbatti la testa contro un soffitto è (0, -1, 0).
Questa cassa distingue gli atterraggi dagli urti laterali:
void OnCollisionEnter(Collision collision)
{
Vector3 normal = collision.GetContact(0).normal;
if (normal.y > 0.5f)
{
Debug.Log("Landed on " + collision.gameObject.name);
}
else
{
Debug.Log("Bumped the side of " + collision.gameObject.name);
}
}Il controllo è normal.y > 0.5f anziché esattamente 1, così anche le pendenze vengono considerate terreno: su una pendenza di 60 gradi, y è 0.5, un'inclinazione maggiore di quella che chiunque riuscirebbe a percorrere camminando. Altri due messaggi sono utili per tutto ciò che dura nel tempo: OnCollisionStay viene eseguito a ogni passo della fisica finché il contatto persiste, mentre OnCollisionExit viene eseguito una volta quando termina. All'uscita non ci sono punti di contatto, perché non c'è più nulla che si tocca, quindi non chiamare GetContact lì.
Sfida
FacileConsenti al giocatore di saltare solo quando è appoggiato su qualcosa.
- Aggiungi
private bool grounded;. InOnCollisionStay, impostalo su true quandocollision.GetContact(0).normal.y > 0.5f; inOnCollisionExit, impostalo su false. - In
FixedUpdate(), salta soloif (jumpPressed && grounded)e impostajumpPressed = false;dopo quell’if, così una pressione in aria viene ignorata.
Premi «Gioca» e prova a fare un doppio salto: la seconda pressione non fa nulla. Poi premi «Verifica».
Provalo tu
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float speed = 4f;
public float jump = 6f;
private Rigidbody rb;
private bool jumpPressed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpPressed = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
if (jumpPressed)
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
jumpPressed = false;
}
}
}
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