Menu
CoddyTech

Restare a terra

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

Ogni contatto ha una normale: una direzione di lunghezza 1, perpendicolare alla superficie che hai toccato, che punta da essa verso il tuo oggetto. collision.GetContact(0) è il primo punto di contatto e la sua normal ti dice quale lato hai toccato. Su un terreno pianeggiante è (0, 1, 0); contro una parete alla tua destra è (-1, 0, 0); quando 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 test è normal.y > 0.5f invece di richiedere esattamente 1, così anche le pendenze vengono considerate terreno: y è 0.5 su una pendenza di 60 gradi, più ripida di quelle che chiunque può percorrere. Altri due messaggi sono utili per qualsiasi cosa duri nel tempo: OnCollisionStay viene eseguito a ogni passaggio della fisica finché dura il contatto, mentre OnCollisionExit viene eseguito una volta quando termina. Un’uscita non ha punti di contatto, perché ormai niente sta più toccando niente, quindi non chiamare GetContact lì.

challenge icon

Sfida

Facile

Il giocatore può camminare e saltare, ma Space funziona anche a mezz’aria, quindi può salire verso il cielo con un salto alla volta e saltare giù dal lato del muro. (Il suo collider ha un materiale senza attrito, quindi scivola lungo i muri invece di restarci attaccato.) Fai in modo che salti solo quando è in piedi su qualcosa.

  • Mantieni un bool grounded: vero mentre il giocatore tocca qualcosa la cui normale di contatto punta verso l’alto (y maggiore di 0.5), falso quando smette di toccarlo.
  • Fai saltare il giocatore solo quando Space è stato premuto e grounded è true. Una pressione in aria viene ignorata, non salvata fino all’atterraggio.

Premi Gioca, prova a saltare due volte e a salire sul muro, poi premi Controlla.

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;
        }
    }
}
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