Menu
CoddyTech

Controllo del terreno con un Ray

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

Un salto dovrebbe iniziare solo da terra. Stand on the Ground lo determinava in base alle normali di contatto, mantenute aggiornate dai messaggi di collisione. Un raggio risponde sul momento, in qualsiasi istante, alla domanda «sono in piedi su qualcosa?»: lancialo dritto verso il basso dal centro, un po' più lungo della distanza tra il centro e il fondo. Questo giocatore è una capsula alta 2 unità, quindi il fondo si trova 1 unità sotto il centro e il raggio è lungo 1.1:

public float jumpForce = 5f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}

Lo 0.1 in più è un margine. Un corpo appoggiato sul pavimento può trovarsi appena sopra di esso o penetrarvi appena, quindi un raggio lungo esattamente 1 non rileva il pavimento in alcuni frame. Un raggio molto più lungo è sbagliato nella direzione opposta: con 3, il giocatore potrebbe saltare di nuovo quando è già a 2 unità da terra; senza alcuna lunghezza, invece, il raggio trova sempre il pavimento, quindi ogni pressione avvia un salto.

Il raggio inizia all'interno del collider del giocatore, che i raggi ignorano, quindi non rileva mai il giocatore. Il tasto viene letto in Update(), perché GetKeyDown è true per un solo frame, e un impulso singolo può essere applicato proprio lì, come in Jump with an Impulse.

challenge icon

Sfida

Medio

La rana salta ogni volta che viene premuto Spazio, anche a mezz’aria, quindi può arrampicarsi fino al cielo. Correggi Hopper in modo che salti solo da terra:

  • Aggiungi un metodo bool IsGrounded() che proietti un raggio dritto verso il basso dal centro della rana. La rana è una sfera scalata a 1.5, quindi il suo raggio è 0.75: fai in modo che il raggio arrivi 0.1 oltre il suo punto più basso.
  • Fai saltare la rana solo quando viene premuto Spazio e IsGrounded() restituisce true.

Premi Gioca e prova a saltare due volte, poi Verifica.

Provalo tu

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float jumpForce = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}
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