Menu
CoddyTech

Salto

Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 39 di 56.

Un salto è una velocità verticale impostata una sola volta, nel momento in cui viene premuto Spazio; la gravità che lo script aggiunge già rallenta poi la salita, la ferma al culmine e riporta il controller a terra. Ciò che resta da determinare è la velocità iniziale per raggiungere una determinata altezza. La gravità riduce la velocità a un ritmo costante, quindi un salto che inizia alla velocità v raggiunge v * v / (2 * g) unità prima di fermarsi. Invertendo la formula, la velocità iniziale per raggiungere un’altezza h è v = √(2 * g * h).

Con gravity memorizzata come numero negativo, -20, e un salto alto 2.5 unità, si ottiene Mathf.Sqrt(2.5f * -2f * -20f), la radice quadrata di 100: 10 unità al secondo. -2f rende positiva la gravità negativa, perché la radice quadrata di un numero negativo è NaN:

if (controller.isGrounded && verticalSpeed < 0f)
{
    verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
    verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;

Il controllo di reimpostazione verifica verticalSpeed < 0f, quindi termina solo le cadute: una semplice reimpostazione if (controller.isGrounded) dopo la riga del salto sovrascriverebbe la velocità del salto nel fotogramma in cui avviene. Il controllo controller.isGrounded sul salto impedisce i salti a mezz’aria. Modifica jumpHeight o gravity nell’Inspector e il salto raggiungerà comunque esattamente jumpHeight, mentre una velocità fissa come verticalSpeed = 8f raggiunge un’altezza diversa per ogni valore di gravità.

challenge icon

Sfida

Medio

Due saltatori eseguono lo stesso Jumper.cs: il Bambino, il cui Inspector imposta gravity a -18 e jumpHeight a 1, e il Canguro, con gravity -8 e jumpHeight 4. La barra spaziatrice imposta verticalSpeed a 9, un valore trovato per tentativi: non è adatto a nessuno dei due saltatori e funziona anche a mezz'aria. Correggi il salto:

  • La barra spaziatrice avvia un salto che raggiunge esattamente jumpHeight, calcolato in base a jumpHeight e gravity specifici di ciascun saltatore.
  • Solo un saltatore a terra può saltare.

Premi Play e salta, poi premi Check.

Provalo tu

using UnityEngine;

public class Jumper : MonoBehaviour
{
    public float speed = 5f;
    public float gravity = -18f;
    public float jumpHeight = 1f;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        if (Input.GetButtonDown("Jump"))
        {
            verticalSpeed = 9f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}
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 Creare veri giochi